List去除重复数据
- 1 使用LinkedHashSet删除arraylist中的重复数据
- 2 使用java8新特性stream进行List去重
- 3 利用HashSet不能添加重复数据的特性
- 4 利用List的contains方法循环遍历
- 5 双重for循环去重
1 使用LinkedHashSet删除arraylist中的重复数据
LinkedHashSet是在一个ArrayList删除重复数据的最佳方法。
LinkedHashSet实现了:
- 删除重复数据
- 保持添加到其中的数据的顺序
在下面的示例中使用LinkedHashSet
删除list
中的重复项。我们将列表数据添加到LinkedHashSet,然后将内容返回到列表中。在显示的结果中,list
没有重复的整数。
public class ArrayTest {
public static void main(String arg[]) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add(i);
list.add(i+1);
}
System.out.println(list);
LinkedHashSet<Integer> hashSet = new LinkedHashSet<>(list);
ArrayList<Integer> list1 = new ArrayList<>(hashSet);
System.out.println(list1);
}
}
运行结果:
[0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
2 使用java8新特性stream进行List去重
要从list中删除重复项,我们也可以使用java 8 stream API。使用steam
的distinct()
方法返回一个由不同数据组成的流,通过对象的equals()方法进行比较。
- 收集所有区域数据List使用Collectors.toList()。
- Java程序,用于在不使用Set的情况下从java中的list中删除重复项。
public class ArrayTest {
public static void main(String arg[]) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add(i);
list.add(i+1);
}
System.out.println(list);
List<Integer> collect = list.stream().distinct().collect(Collectors.toList());
System.out.println(collect);
}
}
运行结果:
[0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
3 利用HashSet不能添加重复数据的特性
由于HashSet不能保证添加顺序,所以只能作为判断条件保证顺序:
private static void removeDuplicate(ArrayList<Integer> list) {
HashSet<Integer> set = new HashSet<>(list.size());
ArrayList<Integer> result = new ArrayList<>(list.size());
for (Integer s:list){
//里面没有该数据的话,就是true
if(set.add(s)){
result.add(s);
}
}
list.clear();
list.addAll(result);
System.out.println(list);
}
运行结果:
[0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
4 利用List的contains方法循环遍历
重新排序,只添加一次数据,避免重复:
private static void removeDuplicate1(ArrayList<Integer> list) {
List<Integer> result = new ArrayList<>(list.size());
for (Integer li:list){
if(!result.contains(li)){
result.add(li);
}
}
list.clear();
list.addAll(result);
System.out.println(list);
}
运行结果:
[0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
5 双重for循环去重
private static void removeDuplicate2(ArrayList<Integer> list) {
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);
j--;
}
}
}
System.out.println(list);
}
运行结果:
[0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
参考:https://blog.csdn.net/qq_37939251/article/details/90713643(思路是对的,不过个人感觉里面的代码不够严谨,所以自己重新打了一遍验证)