【问题标题】:How to sort a arraylist in java如何在java中对arraylist进行排序
【发布时间】:2016-03-12 18:11:13
【问题描述】:

基本上可以通过以下方式进行排序:

Collections.sort(List);

但我的情况有点不同。我有一个包含以下对象的列表。

示例代码 1:

public class GetTraders {
    private String getTraderLegalName;
    private String businessName;
    private Object status;

    public GetTraders(String getTraderLegalName, String businessName, String status) {
        this.getTraderLegalName=getTraderLegalName;
        this.businessName=businessName;
        this.status=status;
    }

我有一个类,它将为上述列表提供如下价值:

public Class getResult {
    List<GetTraders> traders=new ArrayList<GetTraders>();
    public void valueGivenByuser(String legal,String business,Object status)throws Exception {
        GetTraders trade=new GetTraders(legal,business,status);
        traders.add(trade); //Adding value to arrayList
    }
}

这里的问题是,一旦我在交易者数组列表中添加了所有值,我需要排序并显示为输出。我尝试使用 collections.sort() 但它显示编译器异常。

【问题讨论】:

  • 你必须为你的 GetTraders 类实现比较器。
  • 实现Comparator
  • 请不要发布格式不正确的代码。代码格式化是有原因的——以便其他人可以轻松阅读和理解您的代码。如果您发布没有缩进的代码,没有人会费心阅读它。我已经为你修复了你的代码,但在未来,请你自己努力。
  • 它们应该如何排序?按名字?公司名称?
  • 我只想根据businessname进行排序,然后getTraderLegalName。

标签: java collections


【解决方案1】:

如果您仔细查看Collections API,您会发现您有两种选择:

1) 让您的 GetTraders 类实现 Comparable 接口并调用

public static <T extends Comparable<? super T>> void sort(List<T> list)

2) 为 GetTraders 类创建一个新的 Comparator 并调用

public static <T> void sort(List<T> list, Comparator<? super T> c)

第一个解决方案是最简单的,但如果您需要根据多个条件对 GetTraders 对象进行排序,那么第二个是最佳选择。

正如@Vaseph 所指出的,如果您改用 Java 8,生活会突然变得轻松,因为您需要做的就是:

traders.sort((GetTraders trade1, GetTraders trade2) -> {
    return trade1.getBusinessName().compareTo(trade2.getBusinessName());
});

但是,如果您在使用 Comparable 和 Comparator 接口时遇到问题,我建议您先尝试 Java-8 之前的解决方案,然后再深入了解函数式接口的神奇世界。


为了完整起见,还请在下面找到每个解决方案的示例:

1) 基于可比性的解决方案:

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

public class GetTraders1 implements Comparable<GetTraders1> {

    private String getTraderLegalName;
    private String businessName;
    private Object status;

    public GetTraders1(String getTraderLegalName, String businessName, String status) {
        this.getTraderLegalName=getTraderLegalName;
        this.businessName=businessName;
        this.status=status;
    }

    @Override
    public int compareTo(GetTraders1 that) {
        return this.getTraderLegalName.compareTo(that.getTraderLegalName);
    }

    @Override
    public String toString() {
        return "GetTraders [getTraderLegalName=" + getTraderLegalName + ", businessName=" + businessName + ", status=" + status + "]";
    }

    public static void main(String[] args) {

        GetTraders1 getTraders1 = new GetTraders1("1", "bn", "status");
        GetTraders1 getTraders2 = new GetTraders1("2", "bn", "status");
        GetTraders1 getTraders3 = new GetTraders1("3", "bn", "status");

        List<GetTraders1> list = new ArrayList<>();
        list.add(getTraders3);
        list.add(getTraders2);
        list.add(getTraders1);

        System.out.println(list);

        Collections.sort(list);

        System.out.println(list);

    }

}

2) 基于比较器的解决方案

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

public class GetTraders2 {

    private String getTraderLegalName;
    private String businessName;
    private Object status;

    public GetTraders2(String getTraderLegalName, String businessName, String status) {
        this.getTraderLegalName=getTraderLegalName;
        this.businessName=businessName;
        this.status=status;
    }

    @Override
    public String toString() {
        return "GetTraders [getTraderLegalName=" + getTraderLegalName + ", businessName=" + businessName + ", status=" + status + "]";
    }

    public static void main(String[] args) {

        GetTraders2 getTraders1 = new GetTraders2("1", "bn", "status");
        GetTraders2 getTraders2 = new GetTraders2("2", "bn", "status");
        GetTraders2 getTraders3 = new GetTraders2("3", "bn", "status");

        List<GetTraders2> list = new ArrayList<>();
        list.add(getTraders3);
        list.add(getTraders2);
        list.add(getTraders1);

        System.out.println(list);

        Collections.sort(list, new Comparator<GetTraders2>() {

            @Override
            public int compare(GetTraders2 o1, GetTraders2 o2) {
                return o1.getTraderLegalName.compareTo(o2.getTraderLegalName);
            }

        });

        System.out.println(list);

    }

}

【讨论】:

  • 这里可以再增加一个条件吗?比如基于 getTradelegalname 和 businessName 的排序。
  • 如果您现在想按“getTradelegalname”排序,如果相等,则按“businessName”排序,您可以轻松完成。在 Comparable(或 Comparator)逻辑中,检查 o1.getTraderLegalName.compareTo(o2.getTraderLegalName) 的结果,如果是 != 0 则返回,否则返回 o1.businessName.compareTo(o2.businessName) 的结果。在掌握了这些接口之后,看看如何在 Java 8 中使用 Comparator 接口的新“比较”方法来实现它。更加优雅简洁。
【解决方案2】:

这是另一种根据 businessName 对列表元素进行排序的方法:

 traders.sort((GetTraders trade1, GetTraders trade2) -> {
    return trade1.getBusinessName().compareTo(trade2.getBusinessName());
 });

【讨论】:

    【解决方案3】:

    这还没有被提议,但在这里。

    您应该使用Collections#sortComparator

    Collections.sort(traders, (x, y) -> x.getXXX().compareTo(y.getXXX()));
    // XXX could be any String object's getter
    

    【讨论】:

      【解决方案4】:

      使用Comparator 确定顺序。

      Collections.sort(someList, comparator);
      

      【讨论】:

      • 您能否扩展一下,并解释/描述如何使用Comparator
      猜你喜欢
      • 2013-08-20
      • 2019-10-05
      • 2019-09-26
      • 2011-06-05
      • 2013-08-28
      • 1970-01-01
      • 2012-04-26
      • 2013-07-05
      相关资源
      最近更新 更多