Java 如何使用集合对对象的属性进行排序

Java 如何使用集合对对象的属性进行排序,java,Java,你好 我有一个具有以下属性的对象学生: class Student String name Date birthday 我使用arrayList存储学生对象 我的问题是,如何使用collecitons排序按生日对学生名单进行排序 List <Student> studentList = new ArrayList<Student>(); List studentList=new ArrayList(); 我如何编写代码 集合。排序(??) 谢谢您好,

你好

我有一个具有以下属性的对象学生:

class Student
    String name
    Date birthday
我使用arrayList存储学生对象 我的问题是,如何使用collecitons排序按生日对学生名单进行排序

List <Student> studentList = new ArrayList<Student>();
List studentList=new ArrayList();
我如何编写代码

集合。排序(??)


谢谢

您好,这是一个可以帮助您理解的示例

package de.vogella.algorithms.sort.standardjava;

import java.util.Comparator;

public class MyIntComparable implements Comparator<Integer>{

    @Override
    public int compare(Integer o1, Integer o2) {
        return (o1>o2 ? -1 : (o1==o2 ? 0 : 1));
    }
}


package de.vogella.algorithms.sort.standardjava;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Simple2 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(5);
        list.add(4);
        list.add(3);
        list.add(7);
        list.add(2);
        list.add(1);
        Collections.sort(list, new MyIntComparable());
        for (Integer integer : list) {
            System.out.println(integer);
        }
    }
}
package de.vogella.algorithms.sort.standardjava;
导入java.util.Comparator;
公共类MyIntComparator{
@凌驾
公共整数比较(整数o1,整数o2){
返回值(o1>o2-1:(o1==o2?0:1));
}
}
包de.vogella.algorithms.sort.standardjava;
导入java.util.ArrayList;
导入java.util.Collections;
导入java.util.List;
公共类Simple2{
公共静态void main(字符串[]args){
列表=新的ArrayList();
增加(5);
增加(4);
增加(3);
增加(7);
增加(2);
增加第(1)款;
Collections.sort(list,new MyIntComparable());
用于(整数:列表){
System.out.println(整数);
}
}
}
您可以通过传递给来处理生日排序:

Collections.sort(studentList, new Comparator<Student>() {
    public int compare(Student s1, Student s2) {
        return s1.getBirthday().compareTo(s2.getBirthday());
    }
});
Collections.sort(studentList,newcomparator(){
公共整数比较(学生s1、学生s2){
返回s1.getBirthday().compareTo(s2.getBirthday());
}
});

如果您还没有
getBirthday()
类,您需要将它添加到
Student
类中。

您需要编写一个自定义比较器

比如:

Collections.sort(studentList, new Comparator<Student>() {

    public int compare(Strudent a, Strudent b) {
        return a.birthday.compareTo(b.birthday);
    }

});
Collections.sort(studentList,newcomparator(){
公共整数比较(Strudent a、Strudent b){
返回a.birth.compareTo(b.birth);
}
});

以下是java教程,了解更多信息。

在Java 8中,您可以使用and对列表进行单行排序:

或者,您可以使用方法参考:

Collections.sort(studentList, Comparator.comparing(Student::getBirthday));

这可能是一个棘手的面试问题:)

我找到的解决类似问题的最佳和可重用的方法是实现接口比较器,并根据我的需要创建自定义比较器,该比较器可以重用

我在这里留下了一个例子,如何根据人名属性和性别属性(没有任何词典自然顺序)对人名列表进行排序

诀窍是用我想要排序的自定义属性定义一个枚举类。将自定义比较器应用于该枚举属性时,compareTo()方法会根据声明值的自然顺序(在本例中为男性、女性和其他)应用顺序

import java.util.*;
公共阶层人士{
公共枚举性别{
男,女,其他
}
字符串名;
智力年龄;
性别;
公众人物(字符串名称、整数年龄、性别){
this.name=名称;
这个。年龄=年龄;
这个。性别=性别;
}
公共字符串getName(){
返回名称;
}
公共性别{
返回性别;
}
@凌驾
公共字符串toString(){
返回“Person{”+
“name=”+name+“\”+
“,age=“+age+
“,性别=”+性别+“\”+
'}';
}
公共静态无效打印人员(列表人员列表){
对于(int i=0;i
谢谢@WhiteFang34!!这正是我要找的!在设置对象之前,我会浪费很多时间尝试对属性进行排序。我不知道如何处理attribute排序。rthday不应为null
Collections.sort(studentList, Comparator.comparing(Student::getBirthday));
import java.util.*;

public class Person {

public enum Gender {
    male,female, others
}

String name;
int age;
Gender gender;

public Person(String name, int age, Gender gender) {
    this.name = name;
    this.age = age;
    this.gender = gender;
}

public String getName() {
    return name;
}

public Gender getGender() {
    return gender;
}

@Override
public String toString() {
    return "Person{" +
            "name='" + name + '\'' +
            ", age=" + age +
            ", gender='" + gender + '\'' +
            '}';
}

public static void printPersons(List<Person> personList) {

    for (int i = 0; i < personList.size(); i++) {
        System.out.println(personList.get(i).toString());
    }
}

public static void printSortedByAgePersons(List<Person> personList) {
    Collections.sort(personList, Person.COMPARE_BY_NAME);
    for (int i = 0; i < personList.size(); i++) {
        System.out.println(personList.get(i).toString());
    }
}

public static void printSortedByGender(List<Person> personList) {
    Collections.sort(personList, Person.COMPARE_BY_GENDER);
    printPersons(personList);
}

public static Comparator<Person> COMPARE_BY_NAME = new Comparator<Person>() {
    @Override
    public int compare(Person o1, Person o2) {
        return o1.getName().compareTo(o2.getName());
    }
};

public static Comparator<Person> COMPARE_BY_GENDER = new Comparator<Person>() {
    @Override
    public int compare(Person o1, Person o2) {
        return o1.getGender().compareTo(o2.getGender());
    }
};


// lets test this :
public static void main(String args[]) {

    Person p1 = new Person("André", 22, Gender.male);
    Person p2 = new Person("Minder", 19, Gender.others);
    Person p4 = new Person("Maria", 19, Gender.female);
    Person p3 = new Person("Pedro", 25, Gender.male);

    List<Person> personList = new ArrayList<Person>();
    personList.add(p1);
    personList.add(p2);
    personList.add(p3);
    personList.add(p4);

    System.out.println("original list:");
    printPersons(personList);

    System.out.println("------------------------------------------");
    System.out.println("sorted list by name in alphabetical order");
    printSortedByAgePersons(personList);

    System.out.println("------------------------------------------");
    System.out.println("sorted list by custom order(gender)");
    printSortedByGender(personList);

}

}