Sorting array of objects by field

前端 未结 5 1619
北恋
北恋 2021-01-19 16:12

I have objects

Person{
    String name;  
    int age;
    float gradeAverage;
    }

Is there an easy way to sort

Person[]         


        
相关标签:
5条回答
  • 2021-01-19 16:58

    You can implement the Comparable interface to make your class comparable. Make sure to override the compareTo method then.

    public class Person implements Comparable<Person> {
        String name;
        int age;
        float gradeAverage;
    
        @Override
        public int compareTo(Person p) {
            if(this.age < p.getAge()) return -1;
            if(this.age == p.getAge()) return 0;
            //if(this.age > p.getAge()) return 1;
            else return 1;
        }
    
        //also add a getter here
    }
    
    0 讨论(0)
  • 2021-01-19 16:59

    You can check for age using a getter in your loop

    for (int i = 0 ; i < persons.length - 1; i++) {
        Person p = persons[i];
        Person next =  persons[i+1];
        if(p.getAge() > next.getAge()) {
            // Swap
        }
    }
    

    However implementing Comparable is the convenient way

    class Person implements Comparable<Person> {
        String name;  
        int age;
        float gradeAverage;
    
        public int compareTo(Person other) {
            if(this.getAge() > other.getAge())
                return 1;
            else if (this.getAge() == other.getAge())
                return 0 ;
            return -1 ;
        }
    
        public int getAge() {
            return this.age ;
        }
    }
    

    You can check Comparable documentation also

    0 讨论(0)
  • 2021-01-19 17:00

    Just for completeness, when using Java 8, you can use Comparator.comparing to create a simple comparator for some attribute, e.g. Comparator.comparing(Person::getAge), or using lambda, like Comparator.comparing(p -> p.age), if there is not getter method for the age.

    This makes it particularly easy to chain comparators for different attributes, using thenComparing, e.g. for sorting primarily by age, and then by name in case of ties:

    Comparator.comparing(Person::getAge).thenComparing(Person::getName)
    

    Combine that with Arrays.sort, and you are done.

    Arrays.sort(arrayOfPersons, Comparator.comparing(Person::getAge));
    
    0 讨论(0)
  • 2021-01-19 17:04
    import java.util.Arrays;
    
    public class PersonCompare {
    
    public static void main(String[] args) {
        Person p1 = new Person("Test1",10);
        Person p2 = new Person("Test2",12);
        Person p3 = new Person("Test3",4);
        Person p4 = new Person("Test4",7);
    
        Person[] ArrayOfPersons = {p1,p2,p3,p4};
        Arrays.sort(ArrayOfPersons);
    
        for(Person p: ArrayOfPersons) {
            System.out.println(p.getName()+"--"+p.getAge());
        }
    }
    }
    
    
    class Person implements Comparable<Person> {
    String name;
    int age;
    
    Person(String name, int age){
        this.name=name; this.age=age;
    
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public int getAge() {
        return age;
    }
    
    public void setAge(int age) {
        this.age = age;
    }
    
    
    @Override
    public int compareTo(Person other) {
        if(this.getAge() > other.getAge())
            return 1;
        else if (this.getAge() == other.getAge())
            return 0 ;
        return -1 ;
    }
    }
    
    0 讨论(0)
  • 2021-01-19 17:09

    Yes just implement the Comparable interface.

    Here's an example :

    class Person implements Comparable<Person> {
        public int age;
        public String name;
    
        public int compareTo(Person other){
            return this.age == other.age ? 0 : this.age > other.age ? 1 : -1;
        }
    }
    
    0 讨论(0)
提交回复
热议问题