有List list1和List 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 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM