如何在SortedSet <>上定义比较器,如TreeSet <>?

Sau*_*pta 2 java collections set

我想制作一个词汇排序的字符串列表,所以我选择了基本的SortedSet

1)  Set<String> words = new SortedSet<String>(){}
Run Code Online (Sandbox Code Playgroud)

并意识到SortedSet是一个抽象类,我将不得不实现comapartor方法.所以我去google搜索并发现treeSet更好,我可以使用它预定义的比较器方法.

2)  SortedSet<String> words = new TreeSet<String>(){}
Run Code Online (Sandbox Code Playgroud)

当去了java文档时,我意识到TreeSet扩展了AbstractSet而不是SortedSet.问题1 -任何人都可以解释第二行是如何工作的(就像我没有概括我通常会做的集合,而是使用两个完全不同的类,没有父子关系). 问题2 - 如何定义SortedSet的比较器,它将用作TreeSet.所以这是使用TreeSet的工作代码

SortedSet<String> words = new TreeSet<>();
    Scanner scanner1 = new Scanner(System.in);
    String s1 = scanner1.nextLine();
    int a = scanner1.nextInt();
    while(s1.length()>a){
        words.add(s1.substring(0,a));
        s1 = s1.substring(a);
    }
    Iterator itr  = words.iterator();
    while(itr!= null&&itr.hasNext()){
        System.out.println(itr.next());
    }
Run Code Online (Sandbox Code Playgroud)

正常输入

welcometojava
3
Run Code Online (Sandbox Code Playgroud)

预期产出

com
eto
jav
wel
Run Code Online (Sandbox Code Playgroud)

编辑-1对于问题2的答案,我期待这样的事情

Set<String> words = new SortedSet<String>() {
        @Override
        public Comparator<? super String> comparator() {
            return null;
        }
        ......
Run Code Online (Sandbox Code Playgroud)

我基本上想学习,如何在使用SortedSet时在TreeSet中创建一个基本的比较器"like" ?我知道如果有自然顺序,我不需要定义一个新的比较器.

kaz*_*rin 7

答案1:

TreeSet<T>实现NavigableSet<T>接口,扩展SortedSet<T>谁也扩展Set<T>.

接口本身实际上并不进行排序,具体类也是如此.

所以:

Set<String> myStrings = new TreeSet<>();
// Add a bunch of strings
// ...
for (String s : myStrings) {
 System.out.println(s);
}
Run Code Online (Sandbox Code Playgroud)

您仍然可以按顺序排列它们.

答案2:

首先,对于已经实现的类,Comparable<T>可以省略Comparatorfor TreeSet,因为"Natural Ordering"是指使用Comparable<T>compareTo方法.

否则,您可以提供一个Comparator实例作为TreeMap构造函数的第一个参数:

    Set<String> myStrings = new TreeSet<>(new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            // Define comparing logic here
            return o1.compareTo(o2);
        }
    });
Run Code Online (Sandbox Code Playgroud)

或使用Java 8 Lambdas:

    Set<String> myStrings = new TreeSet<>((o1, o2) -> o1.compareTo(o2));
Run Code Online (Sandbox Code Playgroud)