Java 比较器不工作,我可以';我找不到错误

Java 比较器不工作,我可以';我找不到错误,java,sorting,comparator,Java,Sorting,Comparator,我试图用comparator对象对从数据库中获取的对象列表进行排序。它应该比较姓,如果姓相同,它应该比较姓,并确定它们的顺序,因此如果我有这样的列表: [Jon Doe][Zed Adams][John Adams] [John Adams][Zed Adams][Jon Doe] 它应该这样分类: [Jon Doe][Zed Adams][John Adams] [John Adams][Zed Adams][Jon Doe] 现在让我们看看我的代码: 比较级: public clas

我试图用comparator对象对从数据库中获取的对象列表进行排序。它应该比较,如果相同,它应该比较,并确定它们的顺序,因此如果我有这样的列表:

[Jon Doe][Zed Adams][John Adams]
[John Adams][Zed Adams][Jon Doe]
它应该这样分类:

[Jon Doe][Zed Adams][John Adams]
[John Adams][Zed Adams][Jon Doe]

现在让我们看看我的代码:

比较级:

public class ComparatorContactByName implements Comparator<Contact> {
    @Override
    public int compare(Contact c1, Contact c2) {

        // if lastNames of compared objects are not the same, compare them
        if(!c1.getLastName().toLowerCase().equals(c1.getLastName().toLowerCase())){
            return c1.getLastName().compareTo(c2.getLastName());

        // if lastNames are the same, compare by firstName
        }else if(c1.getLastName().toLowerCase().equals(c1.getLastName().toLowerCase())){
            return c1.getFirstName().toLowerCase().compareTo(c2.getFirstName().toLowerCase());

            // other case like firstName and lastName are the same, compare by id
        }else{
            return c1.getContactId() - c2.getContactId();
        }
    }
}

“泽德”应该是第二个,但他是最后一个。有没有办法解决这个逻辑问题?

使用
比较器
API:

 Comparator<Contact> comparator = 
       Comparator.comparing(Contact::getLastName, String.CASE_INSENSITIVE_ORDER)
                 .thenComparing(Concat::getFirstName, String.CASE_INSENSITIVE_ORDER)
                 .thenComparingInt(Contact::getContactId);
比较器比较器=
Comparator.comparing(Contact::getLastName,String.CASE\u不区分大小写\u顺序)
.thenComparing(Concat::getFirstName,String.CASE\u不区分大小写\u顺序)
.然后比较(Contact::getContactId);

使用
比较器
API:

 Comparator<Contact> comparator = 
       Comparator.comparing(Contact::getLastName, String.CASE_INSENSITIVE_ORDER)
                 .thenComparing(Concat::getFirstName, String.CASE_INSENSITIVE_ORDER)
                 .thenComparingInt(Contact::getContactId);
比较器比较器=
Comparator.comparing(Contact::getLastName,String.CASE\u不区分大小写\u顺序)
.thenComparing(Concat::getFirstName,String.CASE\u不区分大小写\u顺序)
.然后比较(Contact::getContactId);

这就是你所做的:

c1.getLastName().toLowerCase().equals(c1.getLastName().toLowerCase()
您正在将c1的姓氏与c1的姓氏进行比较

而是这样做:

c1.getLastName().toLowerCase().equals(c2.getLastName().toLowerCase()

名字也一样

这就是你所做的:

c1.getLastName().toLowerCase().equals(c1.getLastName().toLowerCase()
您正在将c1的姓氏与c1的姓氏进行比较

而是这样做:

c1.getLastName().toLowerCase().equals(c2.getLastName().toLowerCase()

名字也一样

在Java 8+中:
比较器。比较(Contact::getLastName)。然后比较(Contact::getFirstName)。然后比较(Contact::getConcatId)
。在“
c1.getLastName().toLowerCase().equals(c1.getLastName().toLowerCase())
”中:您使用了两次
c1
。使用
c1.getLastName().equalsIgnoreCase(c2.getLastName())
,无论如何。在compare()中,if语句将c1与c1进行比较,而不是将c1与c2进行比较。还要注意,
else if
的条件是
if
条件的补充,因此,在Java 8+中,
比较器。比较(Contact::getLastName)。然后比较(Concat::getFirstName)。然后比较(Contact::getConcatId)
。在“
c1.getLastName().toLowerCase().equals(c1.getLastName().toLowerCase())
”中:您使用了两次
c1
。使用
c1.getLastName().equalsIgnoreCase(c2.getLastName())
,无论如何。在compare()中,if语句将c1与c1进行比较,而不是将c1与c2进行比较。还要注意,
else if
的条件是
if
条件的补充,因此,您永远不会到达最后的
else
。这是不区分大小写的比较吗?@Lothar它使用的是
String.comapreTo
方法。它区分大小写。@对于不区分大小写的比较,请使用
比较(Contact::getLastName,String.case\u不区分大小写\u顺序)
。对于语言敏感的比较,请使用例如
比较(Contact::getLastName,Collator.getInstance(Locale.US))
@ETO,因为问题包含不区分大小写的比较。这是不区分大小写的比较吗?@Lothar它使用的是
String.comapreTo
方法。它区分大小写。@对于不区分大小写的比较,请使用
比较(Contact::getLastName,String.case\u不区分大小写\u顺序)
。对于语言敏感的比较,请使用例如
比较(Contact::getLastName,Collator.getInstance(Locale.US))
@ETO以确定问题包含不区分大小写的比较。