Java 自定义字符串长度比较器:什么';这是我的错吗?

Java 自定义字符串长度比较器:什么';这是我的错吗?,java,collections,treeset,Java,Collections,Treeset,我定义了一个自定义比较器,以按长度对对象的名称(字符串)变量进行排序 以下是我的person类中的代码: class MyNameLengthCompare implements Comparator<Person> { @Override public int compare(Person a, Person b) { if(a.getName().length() > b.getName().length()) {

我定义了一个自定义比较器,以按长度对对象的名称(字符串)变量进行排序

以下是我的person类中的代码:

class MyNameLengthCompare implements Comparator<Person> {

        @Override
        public int compare(Person a, Person b) {
            if(a.getName().length() > b.getName().length()) {
                return -1;
            } else if (a.getName().length() < b.getName().length()) {
                return 1;
            } else
                return 0;
        }

    }
类MyNameLengthCompare实现了Comparator{
@凌驾
公共整数比较(人员a、人员b){
如果(a.getName().length()>b.getName().length()){
返回-1;
}else if(a.getName().length()
然后在我的主要方法中,我调用了
Collections.sort(personList,newmynamelingthcompare)
然后我将它添加到我的树集
myTreeSet.addAll(personList)


但它不是按名称的长度排序的:(

是否使用Comparator构建树集?如果不是,树可能会忽略Comparator和以前的排序,并使用Comparable compareTo方法指定的内容自然排序。

在将其添加到树集中之前,无需对其进行排序。唯一重要的是树是否正确set有比较器。

好吧,我想还有下一个问题:

1) Collections.sort正在对列表进行正确排序

2) 将此集合添加到树集时,它将再次排序,此时将使用Person.compareTo()


3) 尽量不使用Comparator,尽量在Person类中实现Comparable接口,直接将list添加到树中,而不使用集合进行排序。

我也不确定它为什么不起作用,但可以用
返回a.getName().length()-b.getName().length()替换方法体@Bala在比较器中使用类似的“技巧”可能导致缓冲区溢出。在这种特殊情况下,字符串的长度不足以溢出,但这种做法在某些情况下会导致错误的结果,应该避免。OP通过显式地将其设置为-1、0或1来使用最佳实践。对!谢谢但有一个问题:如果在单独的类中定义了比较器,那么在构建树集时使用比较器之前,如何创建比较器的新实例?当我尝试只做MyNameLengthCompare lengthCompare=new MyNameLengthCompare时,java抱怨说“没有Person类型的封闭实例可访问。必须使用Person类型的封闭实例(例如x.new A(),其中x是Person的实例)来限定分配。”
to
Comparator lengthCompare=new Person.MyNameLengthCompare()注意我如何用
Person来限定它。
?现在这可能是因为我去掉了顶部的包装信息(只是为了简单)…@luxuryMode O..M..G。。我忘了去见梅蒂安我又做了一个改变。。。可能就是这个人干的。。。我制作了
mynamelingthcompare
class a
public static class mynamelingthcompare
(添加了
static
)。。。这就是修复它的原因。。。我只是忘了提那件事@奢侈是你的比较仪的一个问题。如果它们的长度相同,让它返回
字符串本身的
比较,这样它就按长度排序,然后按字母顺序排序。因此,与返回0不同的是,返回a.getName().compareTo(b.getName())