如題:要實現高效的遍歷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 }