如何解决允许重复的TreeSet或TreeMap
我需要所有基金价值最高的基金代码
如果那是您要排序的唯一原因,我建议根本不要排序。排序主要带来 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()元素
解决方法
我需要Collection
对元素进行排序,但不会删除重复项。
我已经去了TreeSet
,因为TreeSet
实际上将值添加到支持的TreeMap
:
public boolean add(E e) {
return m.put(e,PRESENT)==null;
}
然后TreeMap使用Comparators
compare
逻辑删除重复项
我写了一个Comparator
在元素相等的情况下返回1而不是0的a
。因此,在元素相等的情况下,TreeSet
带有此元素Comparator
将不会覆盖重复项,而只会对其进行排序。
我已经为简单String
对象测试过,但是我需要一组自定义对象。
public static void main(String[] args)
{
List<String> strList = Arrays.asList( new String[]{"d","b","c","z","s","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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。