【问题标题】:passing comparator to collections.sort() in Java?将比较器传递给 Java 中的 collections.sort()?
【发布时间】:2013-09-06 22:18:00
【问题描述】:

我有以下代码,其中我有一个 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 不允许将可变对象放在集合或字典(map)中)

【问题讨论】:

  • 另请注意 StringBuffer 已过时 - 您应该改用 StringBuilder。

标签: java collections comparator treeset


【解决方案1】:

Collections.sort() 只能应用于List,而您传递的是Set,所以它会失败(根本不应该编译)。

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

【讨论】:

    【解决方案2】:

    Collections.sort 需要 List 而不是 Set。试试这个

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

    并完全删除对sort的调用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-25
      • 1970-01-01
      相关资源
      最近更新 更多