在Java中按对象的属性对ArrayList进行排序

时间:2019-09-10 12:28:14

标签: java sorting arraylist comparable

我希望按照对象的电子邮件地址对其进行排序。

这是我尝试过的方法,但是没有用,但是我什至不确定这是否是执行我想要的正确方法?

public static ArrayList<Billing> sortedListByEmail(ArrayList<Billing> Billing) {
    ArrayList<Billing> Sort = new ArrayList<Billing>();

    for (int i = 0; i < Sort.size(); i++) {
        Collections.sort(Sort, new Comparator<Billing>() {
            public int compare(Billing o1, Billing o2) {
                return o1.getEmail() > o2.getEmail() ? -1 : o1.getEmail().equals(o2.getEmail() ? 0 : 1);
            }
        });
    }

    return Sort;
}

班级休息时间:

import java.util.ArrayList;
import java.util.Collections;
import java.lang.Comparable;
import java.util.Comparator;

public class Billing extends User implements Comparable<User> {
    private Address billingAddress;
    private String email;

    public Billing(String id, String firstName, String lastName, String userName, String password, UserType userType, PermissionType permission, Boolean Status, Address billingAddress, String email) {
        super(id, firstName, lastName, userName, password, userType, permission, Status);

        this.billingAddress = billingAddress;
        this.email = email;
    }

    public Billing(String id, String firstName, String lastName, String userName, String password, UserType userType, PermissionType permission, Boolean Status, String email) {
        super(id, firstName, lastName, userName, password, userType, permission, Status);

    }

    public Billing(String id, String firstName, String lastName, String userName, String password, UserType userType, PermissionType permission, Boolean Status) {
        super(id, firstName, lastName, userName, password, userType, permission, Status);
    }

    public Address getBillingAddress() {
        return billingAddress;
    }

    public void setBillingAddress(Address billingAddress) {
        this.billingAddress = billingAddress;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

我将如何按照对象的电子邮件地址对对象进行排序?谢谢

5 个答案:

答案 0 :(得分:2)

尝试以下代码:

billingList.sort(Comparator.comparing(a -> a.getEmail));

答案 1 :(得分:2)

由于emailString也是Comparable,因此您可以使用String.compareTo通过email属性进行排序。 (这是Java-8之前的解决方案):

public static List<Billing> sortedListByEmail(List<Billing> Billing) {
    List<Billing> sort = new ArrayList<>(Billing);
    Collections.sort(sort, new Comparator<Billing>() {
            public int compare(Billing o1, Billing o2) {
                   return o1.getEmail().compareTo(o2.getEmail());
            }
      }
   );
   return sort;
}

在Java-8中,可以使用Comparator#comparing使它更紧凑:

public static List<Billing> sortedListByEmail(List<Billing> Billing) {
        List<Billing> sorted = new ArrayList<>(Billing);
        sorted.sort(Comparator.comparing(b -> b.getEmail()));
        return sorted;
}

此处提供的原始列表未在适当位置排序,而是制作了一份副本进行排序。

或者您可以使用Stream#sorted以一种优雅的方式进行操作,这也将返回一个新的List而不是修改原始的{}:

public static List<Billing> sortedListByEmail(List<Billing> Billing) {
    return Billing.stream()
                  .sorted(Comparator.comparing(b -> b.getEmail()))
                  .collect(Collectors.toList());
}

答案 2 :(得分:0)

如果您想使用旧方法,请使用以下代码

    public static ArrayList<Billing> sortedListByEmail(ArrayList<Billing> Billing) {

    Collections.sort(Billing, new Comparator<Billing>() {
        public int compare(Billing o1, Billing o2) {
            return o1.getEmail().compareTo(o2.getEmail());
        }
    });

    return Billing;
}

您在代码中做错的几件事- 首先-return o1.getEmail() > o2.getEmail() ? -1 : o1.getEmail().equals(o2.getEmail() ? 0 : 1);,您无法比较字符串值(例如整数值)。

第二个-您正在创建一个空数组列表并对其进行排序。它没有元素,为空。 ArrayList<Billing> Sort = new ArrayList<Billing>(); ........ Collections.sort(Sort, new Comparator<Billing>() {

具有Java 8功能,可以用以下几行代码完成

billing.sort(Comparator.comparing(b -> b.getEmail()));

答案 3 :(得分:0)

这将更改现有数组,不需要新变量,

Collections.sort(billingList, Comparator.comparing(Billing::getEmail));

答案 4 :(得分:0)

考虑到“帐单清单”对象名称为billingList

1)如果您使用的是Java 8,则可以使用以下方法进行操作:

使用具有Lambda表达式的Collections.sort:

Collections.sort(billingList, (b1, b2) -> b1.getEmail().compareTo(b2.getEmail()));

使用列表界面的排序方法(默认方法)

billingList.sort(Comparator.comparing(Billing::getEmail));

2)如果您使用的是Java的早期版本

Collections.sort(billingList, new Comparator<Billing>() {

      public int compare(final Billing b1, final Billing b2) {

        return b1.getEmail().compareTo(b2.getEmail());

      };
    });