2

Treeset がある次のコードがあります。これにコンパレータを渡すと、正常に動作します。ただし、Treeset を構築してから collections.sort を呼び出すと、コンパイル エラーが発生します。私のコードはここにあります

import java.util.*;

public class ComparatorExample {
private static class SbufferComparator implements Comparator<StringBuffer> {

        @Override
        public int compare(StringBuffer s1, StringBuffer s2) {
            return s1.toString().compareTo(s2.toString());

        }

}


    public static void main(String[] args) {
            StringBuffer one = new StringBuffer("one");
            StringBuffer  two = new StringBuffer("two");
            StringBuffer three = new StringBuffer("three");
            Set<StringBuffer> sb=new TreeSet<StringBuffer>();
             //The below line works
            //Set<StringBuffer> sb=new TreeSet<StringBuffer>(new SbufferComparator());
            sb.add(one);
            sb.add(two);
            sb.add(three);
            System.out.println("set before change: "+ sb);
            //This does not work
            Collections.sort(sb, new SbufferComparator());
            System.out.println("set After change: "+ sb);
        }
    }

PS。Set の要素として保持StringBufferする型であることはわかっています。badただし、Java で変更可能なオブジェクトを Set に保持できるかどうかをテストしていました。(Python では、変更可能なオブジェクトをセットまたは辞書 (マップ) に配置することはできません)

4

2 に答える 2

7

Collections.sort()のみに適用でき、 aListを渡しているSetため、失敗します(まったくコンパイルされるべきではありません)。

TreeSetは sortedSetであるため、適切な で作成する必要がComparatorあり、セットのコンテンツは常にソートされ、手動でソートする必要はありません。

于 2013-09-06T22:21:12.790 に答える
3

Collections.sortListではなく を期待しSetます。代わりにこれを試してください

Set<StringBuffer> sb=new TreeSet<StringBuffer>(new SbufferComparator());

sort完全に呼び出しを削除します

于 2013-09-06T22:21:08.883 に答える