当前位置: 首页 > 知识库问答 >
问题:

如何定义SortedSet上的比较器,如TreeSet?

孙清野
2023-03-14

我想制作一个字符串的词汇排序列表,所以我使用了基本的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”?我明白,如果存在自然排序,我不需要定义新的比较器。

共有3个答案

相德宇
2023-03-14

SortedSet

TreeSet

Set

这就是为什么赋值SortedSet

如果不提供显式比较器,TreeSet

史和泰
2023-03-14

为了回答你的问题,

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

徐鸿文
2023-03-14

回答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()在字母顺序上查看哪个更高)。 到目前为止,我有这个: