web-dev-qa-db-ja.com

重複を許可するTreeSetまたはTreeMap

要素を並べ替えるCollectionが必要ですが、重複は削除されません。

TreeSetは実際に裏付けのあるTreeSetに値を追加するので、私はTreeMapを選びました。

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

そして、TreeMapはComparatorscompareロジックを使用して重複を削除します

等しい要素の場合に0ではなく1を返すComparatorを作成しました。したがって、要素が等しい場合、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が必要です

8
Zeeshan

最高の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 のような第3レベルのライブラリを使用することで、このコードを回避できます。参照: グアバのリストからmax()要素を取得する方法

4
Markus Malkusch

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
3
Max Fichtelmann

PriorityQueueを使用できます。

PriorityQueue<Integer> pQueue = 

               new PriorityQueue<Integer>(); 

PriorityQueue():デフォルトの初期容量(11)でPriorityQueueを作成し、自然順序に従って要素を並べ替えます。

3
Sohit Gore

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
Gaya3

要素をarraylistに追加してから、ユーティリティCollections.sortを使用して要素を並べ替えます。次に、comparableを実装し、キーに応じて独自のcompareToメソッドを記述します。

重複も削除されません。並べ替えることもできます。

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

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

  @Override


  public int compare(List left, List right) {


**your logic**

     return '';

  }

}

)
;
0
Amrut Malaji

TreeSetの場合、ComparatorまたはComparableのいずれかを使用してオブジェクトを比較および保存します。イコールは呼び出されないため、重複するものは認識されません。

0