【问题标题】:How can I sort an ArrayList of objects?如何对对象的 ArrayList 进行排序?
【发布时间】:2015-12-27 20:08:04
【问题描述】:

我有和ArrayList 有两个字符串和一个Integer,但我只需要按字符串Name 和字符串LastName 对其进行排序,我尝试过使用Collections.sort 这样的方法

    Collections.sort(MyArrayList, (Contact v1, Contact v2) -> v1.getName().compareTo(v2.getname()));

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

【问题讨论】:

标签: java sorting arraylist


【解决方案1】:

使用Comparator.comparing(Contact::getName).thenComparing(Contact::getLastName) 作为您的比较器:

Collections.sort(MyArrayList, Comparator.comparing(Contact::getName).thenComparing(Contact::getLastName));

【讨论】:

    【解决方案2】:

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

        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}]
    
    }
    

    【讨论】:

      【解决方案3】:

      嗯...将您的闭包转换为一个完整的匿名类,并使用该功能来增加您的排序复杂性...

      类似

       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;
          }
       });
      

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

      【讨论】:

        猜你喜欢
        • 2013-01-06
        • 1970-01-01
        • 1970-01-01
        • 2019-11-24
        • 2012-04-26
        • 1970-01-01
        • 1970-01-01
        • 2011-05-11
        相关资源
        最近更新 更多