本文章是在公眾號
java版web項目
上看到的,轉載記錄一下免得以后找不到了,可能會對部分格式和內容稍作修改,侵刪。
原作者:多纖果凍
blog.csdn.net/qq_37939251/article/details/90713643
以下介紹五種不同的方法去除 Java 中ArrayList中的重復數據。
使用 LinkedHashSet 刪除 arraylist 中的重復數據
LinkedHashSet 是在一個 ArrayList 刪除重復數據的最佳方法。LinkedHashSet 在內部完成兩件事:
- 刪除重復數據
- 保持添加到其中的數據的順序
Java 示例使用 LinkedHashSet 刪除 arraylist 中的重復項。在給定的示例中,numbersList 是包含整數的 arraylist,其中一些是重復的數字。
例如,我們將重復的列表添加到 LinkedHashSet,然后將內容返回到列表中。結果 arraylist 沒有重復的整數。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashSet;
public class ListTest {
public static void main(String[] args) {
ArrayList<Integer> numbersList = new ArrayList<>(Arrays.asList(1, 1, 2, 3, 3, 3, 4, 5, 6, 6, 6, 7, 8));
System.out.println(numbersList);
LinkedHashSet<Integer> hashSet = new LinkedHashSet<>(numbersList);
ArrayList<Integer> listWithoutDuplicates = new ArrayList<>(hashSet);
System.out.println(listWithoutDuplicates);
}
}
輸出結果:
[1, 1, 2, 3, 3, 3, 4, 5, 6, 6, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
使用 java8 新特性 stream 進行 List 去重
要從 arraylist 中刪除重復項,我們也可以使用 java 8 stream api,使用 steam 的 distinct() 方法返回一個由不同數據組成的流,通過對象的 equals() 方法進行比較,在不使用 Set 的情況下從 java 中的 arraylist 中刪除重復項。
使用 Collectors.toList() 收集所有區域數據 List。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class ListTest {
public static void main(String[] args) {
ArrayList<Integer> numbersList = new ArrayList<>(Arrays.asList(1, 1, 2, 3, 3, 3, 4, 5, 6, 6, 6, 7, 8));
System.out.println(numbersList);
List<Integer> collect = numbersList.stream().distinct().collect(Collectors.toList());
System.out.println(collect);
}
}
輸出結果:
[1, 1, 2, 3, 3, 3, 4, 5, 6, 6, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
利用 HashSet 不能添加重復數據的特性
由于 HashSet 不能保證添加順序,所以只能作為判斷條件保證順序。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
public class ListTest {
public static void main(String[] args) {
ArrayList<Integer> numbersList = new ArrayList<>(Arrays.asList(1, 1, 2, 3, 3, 3, 4, 5, 6, 6, 6, 7, 8));
System.out.println(numbersList);
removeDuplicate(numbersList);
System.out.println(numbersList);
}
private static void removeDuplicate(List<Integer> list) {
HashSet<Integer> set = new HashSet<>(list.size());
List<Integer> result = new ArrayList<>(list.size());
for (Integer integer : list) {
if (set.add(integer)) {
result.add(integer);
}
}
list.clear();
list.addAll(result);
}
}
輸出結果:
[1, 1, 2, 3, 3, 3, 4, 5, 6, 6, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
利用 List 的 contains 方法循環遍歷
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ListTest {
public static void main(String[] args) {
ArrayList<Integer> numbersList = new ArrayList<>(Arrays.asList(1, 1, 2, 3, 3, 3, 4, 5, 6, 6, 6, 7, 8));
System.out.println(numbersList);
removeDuplicate(numbersList);
System.out.println(numbersList);
}
private static void removeDuplicate(List<Integer> list) {
List<Integer> result = new ArrayList<>(list.size());
for (Integer integer : list) {
if (!result.contains(integer)) {
result.add(integer);
}
}
list.clear();
list.addAll(result);
}
}
輸出結果:
[1, 1, 2, 3, 3, 3, 4, 5, 6, 6, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
雙重 for 循環去重
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ListTest {
public static void main(String[] args) {
ArrayList<Integer> numbersList = new ArrayList<>(Arrays.asList(1, 1, 2, 3, 3, 3, 4, 5, 6, 6, 6, 7, 8));
System.out.println(numbersList);
removeDuplicate(numbersList);
System.out.println(numbersList);
}
private static void removeDuplicate(List<Integer> list) {
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list.size(); j++) {
if (i != j && list.get(i).equals(list.get(j))) {
list.remove(list.get(j));
}
}
}
}
}
輸出結果:
[1, 1, 2, 3, 3, 3, 4, 5, 6, 6, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]