关于两个List的合并

时间:2022-01-16 03:41:14

两个list如何根据相同的信息连接?
比如List1中有a,b两个字段,list2中有a,c两个字段,怎么根据a的值相同连接起来?
List1:
a b
1 a
2 b
3 c
List2
a c
1 d
2 e
3 f
如何得到list3
1 a d
2 b e
3 c f 

19 个解决方案

#1


先将两个列表排序
然后设置两个指示值p1,p2,如果p1指示的大于p2,移动p2,反之移动p1,如果相等,把p1、p2指示的数据添加到list3,并p1、p2均移动

#2


依此循环直到列表尾

#3


List list1 = new ArrayList();
  String[] item1 = new String[]{"1", "a"};
  String[] item2 = new String[]{"2", "b"};
  String[] item3 = new String[]{"3", "c"};
  list1.add(item1);
  list1.add(item2);
  list1.add(item3);
  
  List list2 = new ArrayList();
  String[] item4 = new String[]{"1", "d"};
  String[] item5 = new String[]{"2", "e"};
  String[] item6 = new String[]{"3", "f"};
  list2.add(item4);
  list2.add(item5);
  list2.add(item6);
  
  String[] itemI = null;
  String[] itemJ = null;
  ArrayList result = new ArrayList();
  for (int i = 0; i < list1.size(); i++) {
   itemI = (String[])list1.get(i);
   for (int j = 0; j < list2.size(); j++) {
    itemJ = (String[])list2.get(j);
    if (itemI[0].equals(itemJ[0])) {
     result.add(new String[]{itemI[0], itemI[1], itemJ[1]});
    }
   }
  }
  
  String[] item = null;
  for (int i = 0; i < result.size(); i++) {
   item = (String[])result.get(i);
   System.out.println(item[0] + " " + item[1] + " " + item[2]);
  }

#4


一个 List 元素中只能存一个值,你为什么可以存两个值?

#5


感谢两位回答。
不过现在的问题可能更复杂一点,就是可能有更多的字段:
比如List1: a b c d e 
    List2: a b c f g
要求a b c 三个字段相同的保留,然后合并,
最后形成a b c d e f g

#6


to bao110908(长牙了,好痛):
不好意思。我说的简化了,其实就是一个list里面有map对象。
如下所示:
List<RowData> dataList = new ArrayList<RowData>();
Map map = (Map) dataList.get(0);

#7


list里放的是个对象

#8


我能想到的是用
List.contains(o)
或者List.indexOf(o)
但是不知道该怎么用

#9


很难看明白,其中的数据结构。map 中的 key 和 value 各是什么?数据的组织方式?因为这些不清楚的话,很难下手的。RowData 是什么样的东东,为什么可以强转成 Map 类型。疑惑多多。

#10


map对象? 那你map对象的Key是什么?

#11


我以为我说清楚了,真晕。
RowData 就是一行的对象,
map(key,value)类似这样的:
比如map(1,a).
感觉可能还没说清楚,
这样吧,能告诉我
List.contains(o)
或者List.indexOf(o)
这两个方法是干嘛用的吗?


#12


contaions 检查 List 中是否有该对象,有返回 true,没有返回 false

indexOf 获得 List 中第一次出现该对象的索引点,没有时返回 -1。

#13


哦,那我有个思路:
把两个List中需要判断的是否相等的几个字段放到对象里
比如:<a,b,c> <d,e>  (其中a,b,c需要判断)
然后在一个list2里遍历list1的<a,b,c>,如果找到,就连接起来。
不过List.contaions只能比较整个对像:<a,b,c> <d,e> 
能不能比较其中的一部分呢?

#14


@_@ 好想帮帮你,但是我实在是弄不清其中的结构。good luck

#15


contains也解决不了你题目中提到的问题呀,它只能判断它自己的列表内的对象是否存在
indexOf是返回对象在列表中的index,更与你的题目没有关系

#16


bao110908(长牙了,好痛) ,sureyor() ( ) 两位大哥留下联系方式,或者加我QQ:37727640好吗?今天务必要解决这个问题,多谢二位了~!

#17


楼主的这个问题其实很容易解决:
用一个List保存所有的Key,比如题目中的1,2,3或者你说的a,b,c当然a,b,c需要拼起来,如果是复杂对象就另当别论啦
用两个hashmap保存[1,a],[1,b],[1,c]和[1,d],[1,e],[1,f],然后遍历list,根据key去两个hashmap中判断是否有存在的对象,如果都有就拼起来,存放到一个list中

#18


1个hashMap就够了,已经测试过
public static void main(String[] args) {  

List list1 = new ArrayList();
  String[] item1 = new String[]{"1", "a"};
  String[] item2 = new String[]{"2", "b"};
  String[] item3 = new String[]{"3", "c"};
  list1.add(item1);
  list1.add(item2);
  list1.add(item3);
  
  List list2 = new ArrayList();
  String[] item4 = new String[]{"1", "d"};
  String[] item5 = new String[]{"2", "e"};
  String[] item6 = new String[]{"3", "f"};
  list2.add(item4);
  list2.add(item5);
  list2.add(item6);
  
  List resultList=new ArrayList();
  Map tempMap=new HashMap();
  Iterator it2 = list2.iterator();
  String[] tempArray=null;
  while(it2.hasNext()){
  tempArray=(String[])it2.next();
  tempMap.put(tempArray[0],tempArray[1]);
  }
  Iterator it1 = list1.iterator();
  while(it1.hasNext()){
  tempArray=(String[])it1.next();
  if(tempMap.get(tempArray[0])!=null){
  String[] resultArray=new String[3];
  resultArray[0]=tempArray[0];
  resultArray[1]=tempArray[1];
  resultArray[2]=String.valueOf(tempMap.get(tempArray[0]));
  resultList.add(resultArray);
  }
  }
  Iterator itResult =resultList.iterator();
  while(itResult.hasNext()){
  tempArray=(String[])itResult.next();
  for(int i=0;i<tempArray.length;i++){
  System.out.print(tempArray[i]);
  }
  System.out.println();
  }
  
}

#19



import java.util.HashMap;
import java.util.Iterator;
import java.util.ArrayList;

public class guess {
    public static void main(String[] args) {
        HashMap map=new HashMap();
        HashMap map2=new HashMap();
        ArrayList list=new ArrayList();
        
        map.put("1","a");
        map.put("2","b");
        map.put("3","c");
        
        map2.put("1","d");
        map2.put("2","e");
        map2.put("3","f");
        
        Iterator it=map.keySet().iterator();
        
        while(it.hasNext())
        {
            Object obj=it.next();
            String[] arr=new String[3];
            arr[0]=String.valueOf(obj);
            arr[1]=String.valueOf(map.get(obj));
            arr[2]=String.valueOf(map2.get(obj));
            list.add(arr);
        }
        
        for (int i=0;i<list.size();i++)
        {
            String[] arr=(String[])list.get(i);
            for (String a:arr)
            {
                System.out.print(a+"\t");
            }
            System.out.println("");
        }
    }
}

#1


先将两个列表排序
然后设置两个指示值p1,p2,如果p1指示的大于p2,移动p2,反之移动p1,如果相等,把p1、p2指示的数据添加到list3,并p1、p2均移动

#2


依此循环直到列表尾

#3


List list1 = new ArrayList();
  String[] item1 = new String[]{"1", "a"};
  String[] item2 = new String[]{"2", "b"};
  String[] item3 = new String[]{"3", "c"};
  list1.add(item1);
  list1.add(item2);
  list1.add(item3);
  
  List list2 = new ArrayList();
  String[] item4 = new String[]{"1", "d"};
  String[] item5 = new String[]{"2", "e"};
  String[] item6 = new String[]{"3", "f"};
  list2.add(item4);
  list2.add(item5);
  list2.add(item6);
  
  String[] itemI = null;
  String[] itemJ = null;
  ArrayList result = new ArrayList();
  for (int i = 0; i < list1.size(); i++) {
   itemI = (String[])list1.get(i);
   for (int j = 0; j < list2.size(); j++) {
    itemJ = (String[])list2.get(j);
    if (itemI[0].equals(itemJ[0])) {
     result.add(new String[]{itemI[0], itemI[1], itemJ[1]});
    }
   }
  }
  
  String[] item = null;
  for (int i = 0; i < result.size(); i++) {
   item = (String[])result.get(i);
   System.out.println(item[0] + " " + item[1] + " " + item[2]);
  }

#4


一个 List 元素中只能存一个值,你为什么可以存两个值?

#5


感谢两位回答。
不过现在的问题可能更复杂一点,就是可能有更多的字段:
比如List1: a b c d e 
    List2: a b c f g
要求a b c 三个字段相同的保留,然后合并,
最后形成a b c d e f g

#6


to bao110908(长牙了,好痛):
不好意思。我说的简化了,其实就是一个list里面有map对象。
如下所示:
List<RowData> dataList = new ArrayList<RowData>();
Map map = (Map) dataList.get(0);

#7


list里放的是个对象

#8


我能想到的是用
List.contains(o)
或者List.indexOf(o)
但是不知道该怎么用

#9


很难看明白,其中的数据结构。map 中的 key 和 value 各是什么?数据的组织方式?因为这些不清楚的话,很难下手的。RowData 是什么样的东东,为什么可以强转成 Map 类型。疑惑多多。

#10


map对象? 那你map对象的Key是什么?

#11


我以为我说清楚了,真晕。
RowData 就是一行的对象,
map(key,value)类似这样的:
比如map(1,a).
感觉可能还没说清楚,
这样吧,能告诉我
List.contains(o)
或者List.indexOf(o)
这两个方法是干嘛用的吗?


#12


contaions 检查 List 中是否有该对象,有返回 true,没有返回 false

indexOf 获得 List 中第一次出现该对象的索引点,没有时返回 -1。

#13


哦,那我有个思路:
把两个List中需要判断的是否相等的几个字段放到对象里
比如:<a,b,c> <d,e>  (其中a,b,c需要判断)
然后在一个list2里遍历list1的<a,b,c>,如果找到,就连接起来。
不过List.contaions只能比较整个对像:<a,b,c> <d,e> 
能不能比较其中的一部分呢?

#14


@_@ 好想帮帮你,但是我实在是弄不清其中的结构。good luck

#15


contains也解决不了你题目中提到的问题呀,它只能判断它自己的列表内的对象是否存在
indexOf是返回对象在列表中的index,更与你的题目没有关系

#16


bao110908(长牙了,好痛) ,sureyor() ( ) 两位大哥留下联系方式,或者加我QQ:37727640好吗?今天务必要解决这个问题,多谢二位了~!

#17


楼主的这个问题其实很容易解决:
用一个List保存所有的Key,比如题目中的1,2,3或者你说的a,b,c当然a,b,c需要拼起来,如果是复杂对象就另当别论啦
用两个hashmap保存[1,a],[1,b],[1,c]和[1,d],[1,e],[1,f],然后遍历list,根据key去两个hashmap中判断是否有存在的对象,如果都有就拼起来,存放到一个list中

#18


1个hashMap就够了,已经测试过
public static void main(String[] args) {  

List list1 = new ArrayList();
  String[] item1 = new String[]{"1", "a"};
  String[] item2 = new String[]{"2", "b"};
  String[] item3 = new String[]{"3", "c"};
  list1.add(item1);
  list1.add(item2);
  list1.add(item3);
  
  List list2 = new ArrayList();
  String[] item4 = new String[]{"1", "d"};
  String[] item5 = new String[]{"2", "e"};
  String[] item6 = new String[]{"3", "f"};
  list2.add(item4);
  list2.add(item5);
  list2.add(item6);
  
  List resultList=new ArrayList();
  Map tempMap=new HashMap();
  Iterator it2 = list2.iterator();
  String[] tempArray=null;
  while(it2.hasNext()){
  tempArray=(String[])it2.next();
  tempMap.put(tempArray[0],tempArray[1]);
  }
  Iterator it1 = list1.iterator();
  while(it1.hasNext()){
  tempArray=(String[])it1.next();
  if(tempMap.get(tempArray[0])!=null){
  String[] resultArray=new String[3];
  resultArray[0]=tempArray[0];
  resultArray[1]=tempArray[1];
  resultArray[2]=String.valueOf(tempMap.get(tempArray[0]));
  resultList.add(resultArray);
  }
  }
  Iterator itResult =resultList.iterator();
  while(itResult.hasNext()){
  tempArray=(String[])itResult.next();
  for(int i=0;i<tempArray.length;i++){
  System.out.print(tempArray[i]);
  }
  System.out.println();
  }
  
}

#19



import java.util.HashMap;
import java.util.Iterator;
import java.util.ArrayList;

public class guess {
    public static void main(String[] args) {
        HashMap map=new HashMap();
        HashMap map2=new HashMap();
        ArrayList list=new ArrayList();
        
        map.put("1","a");
        map.put("2","b");
        map.put("3","c");
        
        map2.put("1","d");
        map2.put("2","e");
        map2.put("3","f");
        
        Iterator it=map.keySet().iterator();
        
        while(it.hasNext())
        {
            Object obj=it.next();
            String[] arr=new String[3];
            arr[0]=String.valueOf(obj);
            arr[1]=String.valueOf(map.get(obj));
            arr[2]=String.valueOf(map2.get(obj));
            list.add(arr);
        }
        
        for (int i=0;i<list.size();i++)
        {
            String[] arr=(String[])list.get(i);
            for (String a:arr)
            {
                System.out.print(a+"\t");
            }
            System.out.println("");
        }
    }
}

#20