【发布时间】:2014-04-10 16:48:42
【问题描述】:
我需要一个 Collection 来对元素进行排序,但不会删除重复项。
我选择了TreeSet,因为TreeSet 实际上将值添加到支持的TreeMap:
public boolean add(E e) {
return m.put(e, PRESENT)==null;
}
TreeMap 使用 Comparators compare 逻辑删除重复项
我写了一个Comparator,它在元素相等的情况下返回 1 而不是 0。因此,在元素相等的情况下,TreeSet 与此 Comparator 不会覆盖重复项,只会对其进行排序。
我已经针对简单的String 对象对其进行了测试,但我需要一组自定义对象。
public static void main(String[] args)
{
List<String> strList = Arrays.asList( new String[]{"d","b","c","z","s","b","d","a"} );
Set<String> strSet = new TreeSet<String>(new StringComparator());
strSet.addAll(strList);
System.out.println(strSet);
}
class StringComparator implements Comparator<String>
{
@Override
public int compare(String s1, String s2)
{
if(s1.compareTo(s2) == 0){
return 1;
}
else{
return s1.compareTo(s2);
}
}
}
这种方法很好还是有更好的方法来实现这一点?
编辑
实际上我有以下类的 ArrayList:
class Fund
{
String fundCode;
BigDecimal fundValue;
.....
public boolean equals(Object obj) {
// uses fundCode for equality
}
}
我需要所有fundCode 最高的fundValue
【问题讨论】:
-
统计每个元素出现的次数对您来说是否足够好? (换句话说,在您的真实代码中,重复项是完全等价的,还是您需要保留一些差异?例如不区分大小写但保留大小写的集合或映射。)
-
这不是一个集合。您需要一个排序列表或类似的东西。来自 javadoc:
A Set is a Collection that cannot contain duplicate elements.违约不是个好主意。 -
如果你可以使用第三部分库,那么 Guava 库可能会有所帮助。见docs.guava-libraries.googlecode.com/git/javadoc/com/google/…(更多关于收藏的信息:code.google.com/p/guava-libraries/wiki/…)
-
@JonSkeet,实际上我有一个 Fund 类的 ArrayList,并且由fundCode 检查相等性。我需要所有具有最高基金价值的基金对象。我已经相应地更新了我的问题
标签: java collections treemap treeset