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" ?我知道如果有自然顺序,我不需要定义一个新的比较器.
答案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)