有List<String> list1和List<String> list2,两个集合各有上万个元素,怎样高效取出两个集合中不同的元素?
如题:要实现高效的遍历list,那么通过map实现为最佳算法,以下是实现思路:
* 1、用map存放list1和list2的所有元素,key为2个list的元素,value为元素出现的次数
* 2、在遍历2个list时,如果有相同的元素,则value++,如果没有,则直接添加到no_list
* 3、最后遍历map,取出value为1的元素,添加到no_list
代码如下:
1 public class Main { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 List<String> list1=new ArrayList<String>(); 8 List<String> list2=new ArrayList<String>(); 9 10 for(int i=0;i<10000;i++){ 11 list1.add(i+"test"); 12 list2.add(i*2+"test"); 13 } 14 15 getNoList(list1,list2); 16 } 17 18 private static List<String> getNoList(List<String> list1,List<String> list2){ 19 long begin=System.currentTimeMillis(); 20 List<String> no_list=new ArrayList<String>(); 21 22 /** 23 * 实现思路: 24 * 1、用map存放list1和list2的所有元素,key为2个list的元素,value为元素出现的次数 25 * 2、在遍历2个list时,如果有相同的元素,则value++,如果没有,则直接添加到no_list 26 * 3、最后遍历map,取出value为1的元素,添加到no_list 27 */ 28 Map<String,Integer> map=new HashMap<String, Integer>(); 29 List<String> max_list=list2; 30 List<String> min_list=list1; 31 32 if(list1.size()>list2.size()){ 33 max_list=list1; 34 min_list=list2; 35 } 36 37 /** 38 * 再进行2个list遍历时,优先遍历size最长的list,提高性能 39 */ 40 for(int i=0;i<max_list.size();i++){ 41 map.put(max_list.get(i), 1); 42 } 43 44 for(int i=0;i<min_list.size();i++){ 45 String key_str=min_list.get(i); 46 Integer count=map.get(key_str); 47 if(count!=null){ 48 map.put(key_str, count++); 49 continue; 50 } 51 /** 52 * 这步很重要,在遍历第2个list时,由于第1个list已经遍历完毕,故在count为null时 53 * 说明该元素为2个list的不同元素,可直接添加到no_list,大大提高性能 54 */ 55 no_list.add(key_str); 56 } 57 58 for(Map.Entry<String, Integer> entry:map.entrySet()){ 59 if(entry.getValue()==1){ 60 no_list.add(entry.getKey()); 61 } 62 } 63 64 long end=System.currentTimeMillis(); 65 System.out.println("总共用时:"+(end-begin)+"毫秒"); 66 //总共用时:56毫秒 67 return no_list; 68 } 69 70 }