0

TreeSet はオブジェクトをソートされた方法で格納することを知っています。しかし、注文をカスタマイズできる方法はありますか?

たとえば、treeSet がある場合:

 TreeSet t1 = new TreeSet();
    t1.add("c");
    t1.add("d");
    t1.add("a");

そして今、私がそれを繰り返すと>

 Iterator it1 =t1.iterator();

    while(it1.hasNext()){
      Object o1 = it1.next();
      System.out.println(o1);
    }

私は常に次のように順序を取得します: a>c>d、ただし、要素を追加したのと同じ順序を返すようにしたい、つまりc>d>a?

4

4 に答える 4

6

それに使っLinkedHashSetて、

TreeSet要素をソートし、文字列の場合は自然順序に基づいてソートします(これがコンパレータの実装方法です)。挿入順序を管理したい場合は、ユーザーLinkedHashSet

一意性(セットの機能)が必要ない場合は、List

于 2012-05-09T11:32:21.760 に答える
3

TreeSet を使用するようにバインドされていることについて言及しているため、次のようなことが頭に浮かびます。

 Set<String> result = new TreeSet<String>(new Comparator<String>(){
    @Override
    public int compare(String arg0, String arg1) {
        return returnCode(arg0).compareTo(returnCode(arg1));
    }
 });

どこ:

private Integer returnCode(String p){
        int code = 0;
        String id = p.toLowerCase();
        if ("a".equalsIgnoreCase(id)) code = 3;
        else if ("b".equalsIgnoreCase(id)) code = 2;
        else if ("c".equalsIgnoreCase(id)) code = 1;
        //etc
        return new Integer(code);
 }  

したがって、基本的には、挿入された文字列に特定の整数値を割り当てるだけの独自のコンパレータを実装しています(これは既に知っていると思います)。

注: returnCode() メソッドでオプションをキャッチしない場合、この解決策は機能しません。TreeSet に供給されるデータについては、すでにご存知だと思います。

于 2012-05-09T15:59:07.917 に答える