高效的找出兩個List中的不同元素

2021-08-21 09:00:54 字數 3464 閱讀 6525

千萬不要採用這種方法,總共要迴圈的次數是兩個list的size相乘的積,從輸出看耗時也是比較長的,那麼我們有沒有其他的方法呢?當然有.

無需解釋這個耗時是必然的,那麼我們還有沒有更好的辦法呢?仔細分析以上兩個方法中我都做了mxn次迴圈,其實完全沒有必要迴圈這麼多次,我們的需求是找出兩個list中的不同元素,那麼我可以這樣考慮:用乙個map存放lsit的所有元素,其中的key為lsit1的各個元素,value為該元素出現的次數,接著把list2的所有元素也放到map裡,如果已經存在則value加1,最後我們只要取出map裡value為1的元素即可,這樣我們只需迴圈m+n次,大大減少了迴圈的次數。
顯然,這種方法大大減少耗時,是方法1的1/4,是方法2的1/40,這個效能的提公升時相當可觀的,但是,這不是最佳的解決方法,觀察方法3我們只是隨機取了乙個list作為首次新增的標準,這樣一旦我們的list2比list1的size大,則我們第二次put時的if判斷也會耗時,做如下改進:
public class testlist 

getdiffrent(list1,list2);

getdiffrent3(list1,list2);

getdiffrent5(list1,list2);

getdiffrent4(list1,list2);

getdiffrent2(list1,list2);

// getdiffrent3 total times 32271699

// getdiffrent5 total times 12239545

// getdiffrent4 total times 16786491

// getdiffrent2 total times 2438731459

}/**

* 獲取兩個list的不同元素

* @param list1

* @param list2

* @return

*/private static listgetdiffrent5(listlist1, listlist2)

mapmap = new hashmap(maxlist.size());

for (string string : maxlist)

for (string string : minlist)

diff.add(string);

}for(map.entryentry:map.entryset())

}system.out.println("getdiffrent5 total times "+(system.nanotime()-st));

return diff;

}/**

* 獲取兩個list的不同元素

* @param list1

* @param list2

* @return

*/private static listgetdiffrent4(listlist1, listlist2)

for (string string : maxlist)

for (string string : minlist)

map.put(string, 1);

}for(map.entryentry:map.entryset())

}system.out.println("getdiffrent4 total times "+(system.nanotime()-st));

return diff;

}/**

* 獲取兩個list的不同元素

* @param list1

* @param list2

* @return

*/private static listgetdiffrent3(listlist1, listlist2)

for (string string : list2)

map.put(string, 1);

}for(map.entryentry:map.entryset())

}system.out.println("getdiffrent3 total times "+(system.nanotime()-st));

return diff;

}/**

* 獲取連個list的不同元素

* @param list1

* @param list2

* @return

*/private static listgetdiffrent2(listlist1, listlist2)

/*** 獲取兩個list的不同元素

* @param list1

* @param list2

* @return

*/private static listgetdiffrent(listlist1, listlist2)

}system.out.println("getdiffrent total times "+(system.nanotime()-st));

return diff;

}}

/**

* list2 在list1 中沒有的值

*/private static listgetdiffrent6(listlist1, listlist2)

for (string string : list2)

}return diff;

}

map 的key 是物件的也是可以。注意重新物件的hashcode,具體原因參考blog map 的hashcode

public class student 

public int getid()

public void setid(int id)

public string getname()

public void setname(string name)

public string getemail()

public void setemail(string email)

//重寫equals方法只要age相等,我們就認為物件兩個相等

@override

public boolean equals(object obj) else

}@override

public int hashcode()

}

private static listgetdifferent(listprelist, listcurlist) 

for (student stu : prelist)

diff.add(stu);

}for(map.entryentry:map.entryset())

}for(student stu:diff)

return diff;

}

找出兩個List 中不同的元素

public class collectionutil 找出兩個集合中不同的元素 param collmax param collmin return public static collection getdifferent collection collmax,collection collmi...

查詢出兩個文件中不同的資料

爬取twitter資料產生了如下文件,我是根據使用者id來爬取的資料,所得到的檔名也設定為使用者的id tweets,所有檔案放在了乙個資料夾下。而我用來抓取資料的id放在了乙個csv檔案下。現在要做的就是匯入這個資料夾下的已經爬取的使用者id號與csv下的所有的使用者id號來進行對比,找出其中沒有...

找出不同的兩個數

有一組數,只有兩個不同的數,其他的數都有乙個相同的數,a1,a1,a2,a2,a3,a3,a4,a4,b,c,a5,a5.找出b,c.把陣列分成兩組a1,a1,a2,a2,b,和 a3,a3,a4,a4,c,然後,分別各自異或,即可得到b,c include using namespace std ...