2014-03-07 57 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 ''; 

    } 

} 

) 
;