我需要Collection对元素进行排序,但不会删除重复项。
Collection
我已经去了TreeSet,因为TreeSet实际上将值添加到支持的TreeMap:
TreeSet
TreeMap
public boolean add(E e) { return m.put(e, PRESENT)==null; }
然后TreeMap使用Comparators compare逻辑删除重复项
Comparators
compare
我写了一个Comparator在元素相等的情况下返回1而不是0的a 。因此,在元素相等的情况下,TreeSet带有此元素Comparator将不会覆盖重复项,而只会对其进行排序。
Comparator
我已经为简单String对象测试过,但是我需要一组自定义对象。
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
fundCode
fundValue
我需要所有基金价值最高的基金代码
如果那是您要排序的唯一原因,我建议根本不要排序。排序主要带来 O(n log(n)) 的复杂性。查找最大值仅具有 O(n) 的复杂度,并且可以通过列表的简单迭代来实现:
List<Fund> maxFunds = new ArrayList<Fund>(); int max = 0; for (Fund fund : funds) { if (fund.getFundValue() > max) { maxFunds.clear(); max = fund.getFundValue(); } if (fund.getFundValue() == max) { maxFunds.add(fund); } }
您可以通过使用Guava等第三级库来避免该代码。请参阅:如何从Guava中的List获取max()元素