2014-03-07 56 views
2

我需要一个排序元素的Collection,但不会删除重复项。我去过TreeSet允许重复项的TreeSet或TreeMap

由于TreeSet实际上增加值的支持TreeMap

public boolean add(E e) { return m.put(e, PRESENT)==null; }

而且树形图使用Comparatorscompare逻辑

我写的删除重复项一个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

+2

会保持每个元素的出现次数的计数是配不上你? (换句话说,在你真实的代码中,重复是完全等价的,还是你需要保留一些差异?一个例子是一个不区分大小写但保持情况的集合或映射。) –

+5

这不会是一个组。你需要一个排序列表或类似的东西。从javadoc:集合是一个集合,不能包含重复的元素.'''打破合同不是一个好主意。 – NeplatnyUdaj

+0

http://stackoverflow.com/a/21974362/2736496 – aliteralmind

回答

4

我需要的所有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避免该代码。请参阅:How to get max() element from List in Guava

3

您可以排序使用Collections.sort列表。

给您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 
0

如果使用TreeSet,Comparator或Comparable用于比较和存储对象。 Equals不会被调用,这就是为什么它不能识别重复的一个

0

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

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 ''; 

    } 

} 

) 
;