在Java语言中,ArrayList集合的去重方式大致可以归纳总结为5种:
1. 双重for循环去重;
2. for循环去重;
3. 借助HashSet方式去重;
4. 借助LinkedHashSet去重;
5. 使用Java 8 新特性stream去重。
为了让你可以更加了解这5种方式的区别,我们以一个简单的例子为例。
案例是:
请你对集合[1,2,3,4,4,5,6,7,8,9,9,0,1,1,2]
进行去重,并完成duplicate
方法。
public class Demo {
public static void main(String[] args) {
int[] array = new int[]{1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 9, 0, 1, 1, 2};
List<Integer> list = new ArrayList<>();
for (int i : array) {
list.add(i);
}
duplicate(list);
System.out.println("你去重的结果是:");
for (Integer i : list) {
System.out.print(i + " ");
}
}
/**
* 请写你需要完成的去重操作
*
* @param list
* @return
*/
private static void duplicate(List<Integer> list) {
//TODO 你的方法
}
}
这一种方式应该是初学者最喜欢使用的方式了。但是因为需要两层for循环,数据量少还好,要是数据量足够大,效率比较低。
private static void duplicate(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) == list.get(j)) {
list.remove(list.get(j));
}
}
}
}
private static void duplicate(List<Integer> list) {
List<Integer> newList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
if (!newList.contains(list.get(i))) {
newList.add(list.get(i));
}
}
list.clear();
list.addAll(newList);
}
private static void duplicate(List<Integer> list) {
HashSet<Integer> set = new HashSet<>();
for (Integer i : list) {
set.add(i);
}
list.clear();
list.addAll(set);
}
LinkedHashSet<Integer> set = new LinkedHashSet<>();
for (Integer i : list) {
set.add(i);
}
list.clear();
list.addAll(set);
List<Integer> newList = list.stream().distinct().collect(Collectors.toList());
list.clear();
list.addAll(newList);