2

私は次のような状況に遭遇しました、そして私は最善の解決策について疑問に思っています。私が持っているとしましょう、List<Object1>そしてList<Object2>、これらのリストは2つの別々のクエリの結果です。どちらも同じサイズで、IDに基づいてリスト内の要素間に1:1の関係があります。最善の解決策は1つのDBクエリでデータをフェッチすることですが、それは今のところ可能です。

だから私の質問は、これらのリストを結合するための最良の方法は何であるかということList<Object3>です。

4

5 に答える 5

3

私は...するだろう

  • 最初のリストを、キーをID、値をObject1としてマップに変換します。
  • 2番目のリストを繰り返し処理し、object2のIDに対応するobject1を取得します。
  • マージ操作または意図されたものを実行し、object3を準備してリストに入れます。

結果の順序は、2番目のリストの順序になります。

于 2012-10-01T09:39:33.510 に答える
1

クエリがIDで順序付けられていることを確認してから、新しいスーパーリストを作成すると同時に、リストを繰り返し処理します。これは絶対確実ではありません。クエリが異なるIDのセットを返す場合、データは破損します。ただし、2つのオブジェクトをスーパーリストに追加する前に、IDが一致することを確認するためのチェックをいつでも追加できます。

于 2012-10-01T09:47:35.843 に答える
1

多くのコードを記述する必要がないため、Apache Common BeanUtilsを使用します。また、データ型の変換も適切です。

この場合、object1Listとobject2Listの両方がIDに基づいて同じ順序である必要があります。これを行うには、Comparableインターフェースを使用して、Object1とObject2の両方のIDに基づいてこれらを並べ替えます。

サンプルコード

Object1.java

public class Object1 implements Comparable<Object1>{

    private Integer id;
    private String name;
    private int quantity;


    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getQuantity() {
        return quantity;
    }
    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }


    public int compareTo(Object1 compareObject1) { 
        int compareId = ((Object1) compareObject1).getId(); 
        //ascending order
        return this.id - compareId; 
    }   
}

Object2.java

public class Object2 implements Comparable<Object2>{

    private Integer id; 
    private double amount ;


    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public double getAmount() {
        return amount;
    }
    public void setAmount(double amount) {
        this.amount = amount;
    }

    public int compareTo(Object2 compareObject2) { 
        int compareId = ((Object2) compareObject2).getId(); 
        //ascending order
        return this.id - compareId; 
    }   
}

Object1およびObject2.javaと同じフィールド名を持つObject3.java

実際の実装

int cnt = 0;
List<Object3> object3List = new ArrayList<Object3>();
List<Object1> object1List = Collections.sort(object1List);
List<Object2> object2List =  Collections.sort(object2List);

for(Object1 obj1 : object1List) {
   BeanUtils.copyProperties(obj3, obj1);
   Object2 obj2 = object2List.get(cnt);
   BeanUtils.copyProperties(obj3, obj2);
   object3List.add(obj3);
   cnt ++;
}
于 2012-10-01T09:47:17.623 に答える
1

私はを使用しますBidiMapApache Commons Collectionsを参照)。

さらに、2つのリストのサイズが同じで、それぞれidが2つのリスト内に存在することが確実な場合は、リストをで並べ替えて、クラシックなforループidでそれらを調べることができます。

Comparator<YourObject> comparator = new Comparator<YourObject>() {
    @Override
    public int compare(YourObject o1, YourObject o2) {
        return o1.getId().compareTo(o2.getId());
    }
};

Collections.sort(list1, comparator);
Collections.sort(list2, comparator);

// import org.apache.commons.collections.BidiMap;
// import org.apache.commons.collections.bidimap.DualHashBidiMap;
BidiMap map = new DualHashBidiMap();

// required: list1.size() == list2.size()
for (int i = 0; i < list1.size(); i++) {
    map.put(list1.get(i), list2.get(i));
}
于 2012-10-01T10:01:18.820 に答える
0

equalsとhashCodeがIDを使用していて、これがオブジェクトの一意性を表す場合は、リストの代わりにセットを使用することもできます。このようにして、次のようなことができるようになりますset1.addAll(set2)

于 2012-10-01T09:49:31.547 に答える