需求:
数据库返回结果集中包含重复数据并存入List集合中,过滤到重复数据并保留最新数据
解析:
数据库中新增记录位置在下面
而SQL查询一般为升序即从上向下查询也就是最新数据
在集合中相同数据的下标越大
解决方法:
方法一:
利用LinkedHashSet,由于HashSet底层为HashMap
新增数据会覆盖原数据既过滤了重复数据又保障了最终结果为最新数据,
但是结果会按照hash值排序
为了保留原顺序采用LinkedHashSet
既保障了结果唯一和数据最新同时又保留原结果的顺序
List<Integer> list = Arrays.asList(5, 5, 5, 5, 5, 3, 3, 3, 1, 2, 2, 4, 4, 4, 4);
List<Integer> nums = new ArrayList<>(list);
Set<Integer> set = new LinkedHashSet<>();
for (Integer num : nums) {
set.add(num);
}
nums.clear();
for (Integer num : set) {
nums.add(num);
}
System.out.println(nums);
方法二:
利用contains方法
声明一个空集合,倒序遍历原集合,将原集合中的数据获取
利用contains方法问原集合中的数据之前声明的空集合中是否存在,
如果不存在则添加该数据到新集合中,
再清空原集合,
倒序遍历新集合,将新集合中的数据保存到原集合
List<Integer> list = Arrays.asList(5, 5, 5, 5, 5, 3, 3, 3, 1, 2, 2, 4, 4, 4, 4);
ArrayList<Integer> nums = new ArrayList<>(list);
List<Integer> results = new ArrayList<>();
for (int i = nums.size() - 1; i >= 0; i--) {
Integer num = nums.get(i);
if (!results.contains(num)) {
results.add(num);
}
}
nums.clear();
for (int i = results.size() - 1; i >= 0; i--) {
Integer num = results.get(i);
nums.add(num);
}
System.out.println(nums);
方法三:
利用Stream API 直接去重 但不敢保障最终结果
List<Integer> list = Arrays.asList(5, 5, 5, 5, 5, 3, 3, 3, 1, 2, 2, 4, 4, 4, 4);
List<Integer> nums = new ArrayList<>(list);
nums = nums.stream().distinct().collect(Collectors.toList());
nums.forEach(System.out::println);