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。我知道StringBuffer是一种bad作为元素保留在 Set 中的类型。但是,我正在测试 Java 是否允许在 Set 中保留可变对象。(python 不允许将可变对象放在集合或字典(地图)中)

4

2 回答 2

7

Collections.sort()只能应用于 a List,并且您正在传递 aSet所以它失败(它根本不应该编译)。

TreeSet是一个 sorted Set,因此您应该使用适当的创建它,Comparator并且集合的内容将始终被排序,而无需手动对其进行排序。

于 2013-09-06T22:21:12.790 回答
3

Collections.sort期望 aList而不是 a Set。试试这个

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

sort并完全删除对

于 2013-09-06T22:21:08.883 回答