如何在关键字段上合并2个Arraylists?

时间:2014-10-31 12:29:47

标签: java arraylist

我有两个关键字段的arraylists。有没有什么聪明的方法如何根据键值将一个arraylist的值与另一个arraylist的值连接起来?

问题在于,有时一个arraylist更大并且包含另一个没有的键,有时它反转。

我应该循环浏览它们,比较字段等吗?还是有什么更好的吗?

按键我的意思是ArrayList<Record>

记录包含:

String blabla;
String keyOrWhatever... just some unique name;

然后还有另一个ArrayList<Record2>

Record2包含:

String differentbleble;
String theSameKeyASRecord;

有时一个List或另一个可能有不同数量的值。

我想象的结果是Result3

有字段:

String differentbleble;
String blabla;
String keyOrWhatever... just some unique name;

4 个答案:

答案 0 :(得分:0)

您可以使用Arraylist的indexOf和equals方法。比如说,你有recordArrayList,record2ArrayList,你想得到record3ArrayList。

现在,您需要为recordArrayList创建一个循环,如下所示。

for(Record recordObject: recordArrayList){
    Record2 tmpRecord2 = new Record2();
    record2.setTheSameKeyAsRecord(recordObject.getTheKeyWhateveer());
    Record2 actualRecord2Object= record2ArrayList.indexOf(tmpRecord2);  // This will return the actual object from the list. But you need to implement the equals method inside Record2.java. If there is no corresponding object then it returns null. So handle it and continue for the loop.

// Now you have both recordObject and actualRecord2Object. You can create object of Record3 and put inside the list.
}

因此,在循环结束时,您将拥有包含Record3实例的record3ArrayList。如果要从recordArrayList和record2ArrayList中删除相同的键对象,则可以在创建Record3后在上面执行for循环。

答案 1 :(得分:0)

问题可能在于您的Record课程。如果您有两个不同的类,并且使用相同的键连接不同的字段,则表明存在一些严重的设计缺陷。

但好吧,让我们一起来吧。想到的唯一解决方案是:

for(record1 in record1ArrayList)
   for(record2 in record2ArrayList)
      if(record1.getKey().equals(record2.getKey()){
         outputArrayList.put(new Record3(record1.getKey(), 
                                      record1.getFieldValue(), record2.getAnotherFieldValue());
      }

答案 2 :(得分:-1)

假设你的对象implement hashCode() and equals() correctly然后只使用一个集合:

Set<Record> allItems = new HashSet<>();
allItems.addAll(arrayList1);
allItems.addAll(arrayList2);
// .. allItems contains a unique set of items from the two lists.
// Convert back to an ArrayList with List<Item> newList = new ArrayList<>(allItems);
// if you like.

答案 3 :(得分:-1)

你可以创建一个连接两个arraylist的集合,因为set删除了重复项,但你需要修改你的记录,在&#34; key&#34;的功能中添加equals和hashcode。字段。