How to sort by two fields in Java?

后端 未结 16 1979
离开以前
离开以前 2020-11-22 08:40

I have array of objects person (int age; String name;).

How can I sort this array alphabetically by name and then by age?

Which algorithm would

相关标签:
16条回答
  • 2020-11-22 09:21

    You can use Collections.sort as follows:

    private static void order(List<Person> persons) {
    
        Collections.sort(persons, new Comparator() {
    
            public int compare(Object o1, Object o2) {
    
                String x1 = ((Person) o1).getName();
                String x2 = ((Person) o2).getName();
                int sComp = x1.compareTo(x2);
    
                if (sComp != 0) {
                   return sComp;
                } 
    
                Integer x1 = ((Person) o1).getAge();
                Integer x2 = ((Person) o2).getAge();
                return x1.compareTo(x2);
        }});
    }
    

    List<Persons> is now sorted by name, then by age.

    String.compareTo "Compares two strings lexicographically" - from the docs.

    Collections.sort is a static method in the native Collections library. It does the actual sorting, you just need to provide a Comparator which defines how two elements in your list should be compared: this is achieved by providing your own implementation of the compare method.

    0 讨论(0)
  • 2020-11-22 09:21

    Guava's ComparisonChain provides a clean way of doing it. Refer to this link.

    A utility for performing a chained comparison statement. For example:

       public int compareTo(Foo that) {
         return ComparisonChain.start()
             .compare(this.aString, that.aString)
             .compare(this.anInt, that.anInt)
             .compare(this.anEnum, that.anEnum, Ordering.natural().nullsLast())
             .result();
       }
    
    0 讨论(0)
  • 2020-11-22 09:22

    For a class Book like this:

    package books;
    
    public class Book {
    
        private Integer id;
        private Integer number;
        private String name;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public Integer getNumber() {
            return number;
        }
    
        public void setNumber(Integer number) {
            this.number = number;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public String toString() {
            return "book{" +
                    "id=" + id +
                    ", number=" + number +
                    ", name='" + name + '\'' + '\n' +
                    '}';
        }
    }
    

    sorting main class with mock objects

    package books;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    
    
    public class Main {
    
        public static void main(String[] args) {
            System.out.println("Hello World!");
    
            Book b = new Book();
    
            Book c = new Book();
    
            Book d = new Book();
    
            Book e = new Book();
    
            Book f = new Book();
    
            Book g = new Book();
            Book g1 = new Book();
            Book g2 = new Book();
            Book g3 = new Book();
            Book g4 = new Book();
    
    
    
    
            b.setId(1);
            b.setNumber(12);
            b.setName("gk");
    
            c.setId(2);
            c.setNumber(12);
            c.setName("gk");
    
            d.setId(2);
            d.setNumber(13);
            d.setName("maths");
    
            e.setId(3);
            e.setNumber(3);
            e.setName("geometry");
    
            f.setId(3);
            f.setNumber(34);
            b.setName("gk");
    
            g.setId(3);
            g.setNumber(11);
            g.setName("gk");
    
            g1.setId(3);
            g1.setNumber(88);
            g1.setName("gk");
            g2.setId(3);
            g2.setNumber(91);
            g2.setName("gk");
            g3.setId(3);
            g3.setNumber(101);
            g3.setName("gk");
            g4.setId(3);
            g4.setNumber(4);
            g4.setName("gk");
    
    
    
    
    
            List<Book> allBooks = new ArrayList<Book>();
    
            allBooks.add(b);
            allBooks.add(c);
            allBooks.add(d);
            allBooks.add(e);
            allBooks.add(f);
            allBooks.add(g);
            allBooks.add(g1);
            allBooks.add(g2);
            allBooks.add(g3);
            allBooks.add(g4);
    
    
    
            System.out.println(allBooks.size());
    
    
            Collections.sort(allBooks, new Comparator<Book>() {
    
                @Override
                public int compare(Book t, Book t1) {
                    int a =  t.getId()- t1.getId();
    
                    if(a == 0){
                        int a1 = t.getNumber() - t1.getNumber();
                        return a1;
                    }
                    else
                        return a;
                }
            });
            System.out.println(allBooks);
    
        }
    
    
       }
    
    0 讨论(0)
  • 2020-11-22 09:24

    I'm not sure if it's ugly to write the compartor inside the Person class in this case. Did it like this:

    public class Person implements Comparable <Person> {
    
        private String lastName;
        private String firstName;
        private int age;
    
        public Person(String firstName, String lastName, int BirthDay) {
            this.firstName = firstName;
            this.lastName = lastName;
            this.age = BirthDay;
        }
    
        public int getAge() {
            return age;
        }
    
        public String getFirstName() {
            return firstName;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        @Override
        public int compareTo(Person o) {
            // default compareTo
        }
    
        @Override
        public String toString() {
            return firstName + " " + lastName + " " + age + "";
        }
    
        public static class firstNameComperator implements Comparator<Person> {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.firstName.compareTo(o2.firstName);
            }
        }
    
        public static class lastNameComperator implements Comparator<Person> {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.lastName.compareTo(o2.lastName);
            }
        }
    
        public static class ageComperator implements Comparator<Person> {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.age - o2.age;
            }
        }
    }
    public class Test {
        private static void print() {
           ArrayList<Person> list = new ArrayList();
            list.add(new Person("Diana", "Agron", 31));
            list.add(new Person("Kay", "Panabaker", 27));
            list.add(new Person("Lucy", "Hale", 28));
            list.add(new Person("Ashley", "Benson", 28));
            list.add(new Person("Megan", "Park", 31));
            list.add(new Person("Lucas", "Till", 27));
            list.add(new Person("Nicholas", "Hoult", 28));
            list.add(new Person("Aly", "Michalka", 28));
            list.add(new Person("Adam", "Brody", 38));
            list.add(new Person("Chris", "Pine", 37));
            Collections.sort(list, new Person.lastNameComperator());
            Iterator<Person> it = list.iterator();
            while(it.hasNext()) 
                System.out.println(it.next().toString()); 
         }  
    }    
    
    0 讨论(0)
提交回复
热议问题