我想制作一个字符串的词汇排序列表,所以我使用了基本的SortedSet
1) Set<String> words = new SortedSet<String>(){}
并意识到SortedSet是一个抽象类,我必须在其中实现comapartor方法。所以我去谷歌搜索,发现treeSet更好,我可以使用它预定义的比较器方法。
2) SortedSet<String> words = new TreeSet<String>(){}
当我去java文档时,我意识到TreeSet扩展了AbstractSet而不是SortedSet。问题1-有人能解释一下第二行是如何工作的吗(就像我没有概括Set一样,我通常会这样做,而是使用两个完全不同的类,没有父子关系)。问题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());
}
正常输入
welcometojava
3
预期输出
com
eto
jav
wel
edit-1对于问题2的答案,我期待这样的事情
Set<String> words = new SortedSet<String>() {
@Override
public Comparator<? super String> comparator() {
return null;
}
......
我主要想学习,如何在使用SortedSet时在TreeSet中创建一个基本的比较器“like”?我明白,如果存在自然排序,我不需要定义新的比较器。
为了回答你的问题,
TreeSet还实现了NavigableSet,它扩展了SortedSet
public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializable
public interface NavigableSet<E> extends SortedSet<E>
默认情况下,排序将基于自然顺序进行,基本原语包装器(Integer,Long,
)实现Comparable
接口,因此如果集合包含原语包装器,并且需要自然顺序,则无需实现Comparable
但是,如果自定义类应该在TreeSet
中排序,那么它应该实现Comparable,否则在添加第二个元素后将抛出ClassCastException
回答1:
TreeSet
接口本身实际上不做排序,具体类做。
所以:
Set<String> myStrings = new TreeSet<>();
// Add a bunch of strings
// ...
for (String s : myStrings) {
System.out.println(s);
}
你仍然会把它们按顺序排列。
答复2:
首先,对于已经实现
可比的类
否则,您可以提供一个
比较器
实例作为树映射构造函数的第一个参数:
Set<String> myStrings = new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// Define comparing logic here
return o1.compareTo(o2);
}
});
或使用Java8 Lambdas:
Set<String> myStrings = new TreeSet<>((o1, o2) -> o1.compareTo(o2));
下面的代码片段适用于条件1,但不适用于条件2。
问题内容: 我想为汽车清单开发一个排序演示。我正在使用数据表显示汽车列表。现在实际上我想按汽车颜色对列表进行排序。这里不是按字母顺序排序的。我想使用我的自定义排序顺序,例如先是红色汽车,然后是蓝色,等等。 为此,我尝试使用,但它只允许按字母顺序排序。 因此,任何人都可以指导我实现使用该技术的方法,以便使排序变得更快。 问题答案: 我建议你为汽车颜色创建一个枚举,而不要使用字符串,并且枚举的自然顺序
问题内容: 我正在尝试使用两个SingleColumnValueFilter对象从HBase表中过滤行,以带回属于该列的长值范围内的所有记录。根据SingleColumnValueFilter的文档,除非您将其传递给自己的比较器,否则它将对列值进行字典比较。该API显示了SingleColumnValueFilter,其中采用WritableByteArrayComparable作为实现此目的的方
在我的PriorityQueue中,我有两种类型的客户,即VIP和常规客户。我想先为贵宾服务,再为常客服务。 如果CustomerID<100,则视为VIP。 如果客户是VIP,他会排在队列中VIP部分的最后 更新:我不想排序任何其他列除了VIP。我不想添加“日期”,因为它感觉像是一个黑客,而不是理解Java是如何工作的。
我被给了下面的代码作为家庭作业。我被要求为雇员对象实现比较器。compare方法返回一个int。但是,如果对employee类中的方法进行比较,则没有一个方法返回int。谁能给我一些关于比较方法应该如何工作的指导?谢谢。
你好,我想知道是否有人可以帮助我完成一些我卡住的代码。因此,我正在使用lambda语句编写一个自定义比较器,我想执行以下操作。如果返回.getName()的名称彼此相等,那么我想从.getDirection()中选择一个是字符串“Up”(在这种情况下,它保证其中一个是“Up”,另一个是“Down”),否则我们将根据.getType()在字母顺序上查看哪个更高)。 到目前为止,我有这个: