小编典典

允许重复的TreeSet或TreeMap

java

我需要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","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


阅读 597

收藏
2020-11-23

共1个答案

小编典典

我需要所有基金价值最高的基金代码

如果那是您要排序的唯一原因,我建议根本不要排序。排序主要带来 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()元素

2020-11-23