如何将Collection转为TreeSet去重后再转回Collection?
解决方法:用TreeSet去重并转回Collection
Hey George, 这事儿其实挺简单的,我给你一步步讲清楚怎么操作,还会附上代码示例:
核心思路
TreeSet本身就是Collection的实现类,同时它会自动基于元素的排序规则去重(因为它是有序集合,不允许重复元素)。所以我们只需要把原Collection传入TreeSet的构造方法,就能自动完成去重,之后如果需要转回通用的Collection类型,直接用就行,或者转成你需要的具体实现类(比如ArrayList)。
具体步骤&代码示例
1. 将Collection转为TreeSet(自动去重+排序)
直接使用TreeSet的构造方法,把你的Collection<String>传进去就行。TreeSet会默认按照字符串的自然字典序排序,同时自动剔除重复元素:
// 假设你已经有了目标Collection<String> Collection<String> collection = ...; // 转成TreeSet,自动去重+排序 TreeSet<String> deduplicatedTreeSet = new TreeSet<>(collection);
如果你需要自定义排序规则(比如忽略大小写的字符串排序),可以传入一个Comparator:
// 自定义忽略大小写的排序器 TreeSet<String> deduplicatedTreeSet = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); // 把原集合的元素加进去,自动去重 deduplicatedTreeSet.addAll(collection);
2. 将TreeSet转回Collection
这里有两种方式,根据你的需求选择:
- 方式一:直接使用TreeSet:因为TreeSet本身就实现了Collection接口,所以你可以直接把它赋值给Collection类型的变量,完全符合要求:
Collection<String> resultCollection = deduplicatedTreeSet; - 方式二:转成其他Collection实现类:如果你需要一个非有序的集合(比如ArrayList),可以用目标集合的构造方法把TreeSet传进去:
// 转成ArrayList Collection<String> resultCollection = new ArrayList<>(deduplicatedTreeSet);
注意事项
- TreeSet不允许存储null元素,如果你的原Collection里有null,转TreeSet的时候会抛出
NullPointerException。如果有这种情况,建议先过滤掉null:Collection<String> filteredCollection = collection.stream() .filter(Objects::nonNull) .collect(Collectors.toList()); TreeSet<String> deduplicatedTreeSet = new TreeSet<>(filteredCollection); - TreeSet的去重逻辑是基于
compareTo()方法(对于实现Comparable的元素,比如String):如果两个元素的compareTo()返回0,TreeSet就会认为它们是重复元素,不会存入。这和HashSet基于equals()和hashCode()的去重逻辑略有不同,这点要注意。
内容的提问来源于stack exchange,提问作者George99
相关产品推荐
相关产品推荐

