Java 如何对对象的ArrayList进行排序?

Java 如何对对象的ArrayList进行排序?,java,sorting,arraylist,Java,Sorting,Arraylist,我有和ArrayList两个字符串和一个整数,但我只需要按字符串名称和字符串LastName对其排序,我尝试了方法Collections.sort,如下所示 Collections.sort(contacts, (Contact c1, Contact c2) -> { int firstNameComparisonResult = c1.getFirstName().compareTo(c2.getFirstName()); if (firstNa

我有和
ArrayList
两个字符串和一个
整数
,但我只需要按字符串
名称
和字符串
LastName
对其排序,我尝试了方法
Collections.sort
,如下所示

    Collections.sort(contacts, (Contact c1, Contact c2) -> {
        int firstNameComparisonResult = c1.getFirstName().compareTo(c2.getFirstName());
        if (firstNameComparisonResult != 0) {
            return firstNameComparisonResult;
        } else {
            return c1.getLastName().compareTo(c2.getLastName());
        }
    });
Collections.sort(MyArrayList,(Contact v1,Contact v2)->v1.getName().compareTo(v2.getName());

但这只是按姓名对我的
ArrayList进行排序,不包括姓氏,如何将姓氏添加到排序中?

好吧。。。将闭包转换为完全匿名类,并使用该功能增加排序复杂性

差不多

 Collections.sort(MyArrayList, new Comparator<Contact>() {
    public int compare(Contact v1, Contact v2) {
        int returned =  v1.getvName().compareTo(v2.getname())
        if(returned==0) {
            // alas, Math.signum returns a float value in this cas
            returned = (int) Math.signum(v1.getYourInt(), v2.getYourInt())
        }
        return returned;
    }
 });
Collections.sort(MyArrayList,newcomparator(){
公共整数比较(触点v1,触点v2){
返回的int=v1.getvName().compareTo(v2.getname())
如果(返回==0){
//唉,Math.signum在此cas中返回一个浮点值
返回=(int)Math.signum(v1.getYourInt(),v2.getYourInt())
}
返回;
}
});

警告此代码未以任何方式编译。

您只需更改比较函数以包含其他类似字段

    Collections.sort(contacts, (Contact c1, Contact c2) -> {
        int firstNameComparisonResult = c1.getFirstName().compareTo(c2.getFirstName());
        if (firstNameComparisonResult != 0) {
            return firstNameComparisonResult;
        } else {
            return c1.getLastName().compareTo(c2.getLastName());
        }
    });
警告:这假设没有空值

如果您想查看,请参阅我使用的完整代码:

class Contact{
    final String firstName;
    final String lastName;
    final int age;

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public int getAge() {
        return age;
    }

    public Contact(String firstName, String lastName, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Contact{" +
                "firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", age=" + age +
                '}';
    }
}

@Test
public void sortTest(){
    List<Contact> contacts = new ArrayList<>();
    contacts.add(new Contact("A","B",37));
    contacts.add(new Contact("A","C",34));
    contacts.add(new Contact("B","A",35));

    Collections.sort(contacts, (Contact c1, Contact c2) -> {
        int firstNameComparisonResult = c1.getFirstName().compareTo(c2.getFirstName());
        if (firstNameComparisonResult != 0) {
            return firstNameComparisonResult;
        } else {
            return c1.getLastName().compareTo(c2.getLastName());
        }
    });

    System.out.println(contacts);
 //[Contact{firstName='A', lastName='B', age=37}, Contact{firstName='A', lastName='C', age=34}, Contact{firstName='B', lastName='A', age=35}]

}
class联系人{
最后一个字符串名;
最后一个字符串lastName;
最终积分;
公共字符串getFirstName(){
返回名字;
}
公共字符串getLastName(){
返回姓氏;
}
公共整数getAge(){
回归年龄;
}
公共联系人(字符串名、字符串名、整数){
this.firstName=firstName;
this.lastName=lastName;
这个。年龄=年龄;
}
@凌驾
公共字符串toString(){
返回“联系人{”+
“firstName=”+firstName+“\”+
“,lastName='”+lastName+'\''+
“,age=“+age+
'}';
}
}
@试验
公共无效排序集(){
列表联系人=新建ArrayList();
新增(新联系人(“A”、“B”、“37”);
新增(新联系人(“A”、“C”、“34”);
新增(新联系人(“B”、“A”、“35”);
收集.排序(联系人,(联系人c1,联系人c2)->{
int firstNameComparisonResult=c1.getFirstName().compareTo(c2.getFirstName());
if(firstNameComparisonResult!=0){
返回firstNameComparisonResult;
}否则{
返回c1.getLastName().compareTo(c2.getLastName());
}
});
系统输出打印项次(联系人);
//[联系人{firstName='A',lastName='B',age=37},联系人{firstName='A',lastName='C',age=34},联系人{firstName='B',lastName='A',age=35}]
}

使用
比较器。比较(Contact::getName)。然后比较(Contact::getLastName)
比较器:

Collections.sort(MyArrayList, Comparator.comparing(Contact::getName).thenComparing(Contact::getLastName));
可能重复:。您的比较器也必须尊重姓氏。