前言:
還記得在2021我發(fā)布的第一篇博客就是關(guān)于數(shù)組的去重,從那一刻開(kāi)始,命運(yùn)的齒輪開(kāi)始轉(zhuǎn)動(dòng)……
扯遠(yuǎn)了哈哈哈,我重新寫(xiě)這篇文章只是想讓去重方式更加嚴(yán)謹(jǐn)(ps:我才不會(huì)說(shuō)是因?yàn)榧夹g(shù)成長(zhǎng)了,看不上之前寫(xiě)的了哈哈哈
方式一:
?依據(jù)Set集合的特性,使用set去重(最簡(jiǎn)潔高效)
/**
* 使用set去重
*
* @param list
*/
private void setDistinct(List<String> list) {
System.out.println("Set 開(kāi)始去重,條數(shù):" + list.size());
List<String> listDistinctResult = new ArrayList<>(new HashSet(list));
System.out.println("Set 去重完畢,條數(shù):" + listDistinctResult.size());
}
方式二:
?使用高級(jí)的stream流方式去重(可讀性高,效率高)
/**
* 使用Stream 去重
*
* @param list
*/
private void useStreamDistinct(List<String> list) {
System.out.println("stream 開(kāi)始去重,條數(shù):" + list.size());
List<String> listDistinctResult = list.stream().distinct().collect(Collectors.toList());
System.out.println("stream 去重完畢,條數(shù):" + listDistinctResult.size());
}
方式三:
?使用list.contain去重(效率一般)
/**
* 使用 list.contain 去重,返回一個(gè)新集合
*
* @param list
*/
private void listContainDistinct(List<String> list) {
System.out.println("contains 開(kāi)始去重,舊集合條數(shù):" + list.size());
List<String> listDistinctResult = new ArrayList<>();
for (String str : list) {
if (!listDistinctResult.contains(str)) {
listDistinctResult.add(str);
}
}
System.out.println("contains 去重完畢,新集合條數(shù):" + listDistinctResult.size());
}
方式四:
喜聞樂(lè)見(jiàn)的for循環(huán)去重(最常見(jiàn),數(shù)據(jù)量大不建議使用)
/**
* 使用for循環(huán)去重
* @param list
*/
private void useForDistinct(List<String> list) {
System.out.println("list 雙循環(huán) 開(kāi)始去重,條數(shù):" + list.size());
for (int i = 0; i < list.size(); i++) {
for (int j = i + 1; j < list.size(); j++) {
if (list.get(i).equals(list.get(j))) {
list.remove(j);
}
}
}
System.out.println("list 雙循環(huán) 去重完畢,條數(shù):" + list.size());
}
特殊情況:
以上都是簡(jiǎn)單的list集合去重,但是當(dāng)我們遇到一些特殊情況,比如:當(dāng)一個(gè)集合中存的是Map,Map中有一些鍵值是重復(fù),而我們需要去除這些重復(fù)的對(duì)象;以上的三種方式就不太適用了,這種情況就只能使用多層級(jí)for循環(huán)來(lái)做了(這種復(fù)雜情況應(yīng)該可以使用stream來(lái)做,不過(guò)沒(méi)試過(guò)就不說(shuō)了),當(dāng)然數(shù)據(jù)量大的話(huà)肯定效率是比較吃緊的,因此如果在不需要數(shù)據(jù)實(shí)時(shí)同步的情況下,可以考慮新開(kāi)線(xiàn)程去執(zhí)行這個(gè)去重然后走之后的業(yè)務(wù)流程文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-629363.html
這種特殊情況的代碼如下:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-629363.html
/**
* 數(shù)組去重
* (目前僅針對(duì)于前三列相同進(jìn)行去重;
* 例如:業(yè)務(wù)層面來(lái)講:即當(dāng)用戶(hù)名,身份證,手機(jī)號(hào),郵箱等重要信息都相同時(shí),
* 去除這一重復(fù)數(shù)據(jù))
*
* @param dataList
* @return
*/
private List<Map<Integer, String>> removeSameMapData(List<Map<Integer, String>> dataList) {
int i = 0;
List<Map<Integer, String>> distinctList = new ArrayList<>();
for (Map<Integer, String> map : dataList) {
boolean isDuplicate = false;
for (Map<Integer, String> distinctMap : distinctList) {
for (Map.Entry<Integer, String> entry : map.entrySet()) {
Integer key = entry.getKey();
if (key <= 3 && StringUtils.equals(map.get(key), distinctMap.get(key))){
i ++;
}
if (i >= 3){
i = 0;
isDuplicate = true;
break;
}
}
}
if (!isDuplicate) {
distinctList.add(map);
}
}
return distinctList;
}
到了這里,關(guān)于對(duì)List集合、數(shù)組去重的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!