允许重复的TreeSet或TreeMap

问题描述 投票:7回答:6

我需要一个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

java collections treemap treeset
6个回答
4
投票

我需要所有具有最高fundValue的fundCode

如果这是您想要排序的唯一原因,我建议不要排序。排序主要是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等第三级库来避免该代码。见:How to get max() element from List in Guava


3
投票

你可以使用Collections.sort对List进行排序。

给你的Fund

List<Fund> sortMe = new ArrayList(...);
Collections.sort(sortMe, new Comparator<Fund>() {
  @Override
  public int compare(Fund left, Fund right) {
    return left.fundValue.compareTo(right.fundValue);
  }
});
// sortMe is now sorted

3
投票

您可以使用PriorityQueue。

PriorityQueue<Integer> pQueue = 

               new PriorityQueue<Integer>(); 

PriorityQueue():创建一个PriorityQueue,其默认初始容量(11)根据其自然顺序对其元素进行排序。


0
投票

在TreeSet的情况下,Comparator或Comparable用于比较和存储对象。不调用等号,这就是为什么它不能识别重复的那个


0
投票

我们可以使用List并实现Comparable接口,而不是TreeSet。

public class Fund implements Comparable<Fund> {

    String fundCode;
    int fundValue;

    public Fund(String fundCode, int fundValue) {
        super();
        this.fundCode = fundCode;
        this.fundValue = fundValue;
    }

    public String getFundCode() {
        return fundCode;
    }

    public void setFundCode(String fundCode) {
        this.fundCode = fundCode;
    }

    public int getFundValue() {
        return fundValue;
    }

    public void setFundValue(int fundValue) {
        this.fundValue = fundValue;
    }

    public int compareTo(Fund compareFund) {

        int compare = ((Fund) compareFund).getFundValue();
        return compare - this.fundValue;
    }

    public static void main(String args[]){

        List<Fund> funds = new ArrayList<Fund>();

        Fund fund1 = new Fund("a",100);
        Fund fund2 = new Fund("b",20);
        Fund fund3 = new Fund("c",70);
        Fund fund4 = new Fund("a",100);
        funds.add(fund1);
        funds.add(fund2);
        funds.add(fund3);
        funds.add(fund4);

        Collections.sort(funds);

        for(Fund fund : funds){
            System.out.println("Fund code: " + fund.getFundCode() +  "  Fund value : " + fund.getFundValue());
        }
    }
}

0
投票

将元素添加到arraylist,然后使用实用程序Collections.sort对元素进行排序。然后实现可比较,并根据您的密钥编写自己的compareTo方法。

不会删除重复项,也可以排序:

List<Integer> list = new ArrayList<>();

Collections.sort(list,new Comparator<Integer>() 
{

  @Override


  public int compare(List left, List right) {


**your logic**

     return '';

  }

}

)
;
© www.soinside.com 2019 - 2024. All rights reserved.