【问题标题】:How to sort an ArrayList in Java [duplicate]如何在Java中对ArrayList进行排序[重复]
【发布时间】:2013-08-28 19:23:42
【问题描述】:

我有一个名为 Fruit 的课程。我正在创建此类的列表并在列表中添加每个水果。我想根据水果名称的顺序对这个列表进行排序。

public class Fruit{

    private String fruitName;
    private String fruitDesc;
    private int quantity;

    public String getFruitName() {
        return fruitName;
    }
    public void setFruitName(String fruitName) {
        this.fruitName = fruitName;
    }
    public String getFruitDesc() {
        return fruitDesc;
    }
    public void setFruitDesc(String fruitDesc) {
        this.fruitDesc = fruitDesc;
    }
    public int getQuantity() {
        return quantity;
    }
    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }
}

我正在使用 for 循环创建它的列表

List<Fruit>  fruits= new ArrayList<Fruit>();

Fruit fruit;
for(int i=0;i<100;i++)
{
   fruit = new fruit();
   fruit.setname(...);
   fruits.add(fruit);
}

我需要使用列表中每个对象的水果名称对这个数组列表进行排序

怎么样??

【问题讨论】:

标签: java sorting collections arraylist


【解决方案1】:

为 Fruit 实现 Comparable 接口。

public class Fruit implements Comparable<Fruit> {

实现方法

@Override
    public int compareTo(Fruit fruit) {
        //write code here for compare name
    }

然后调用排序方法

Collections.sort(fruitList);

【讨论】:

  • Collections.sort(..) 也适用于ArrayList&lt;T&gt;,其中TIntegerLongString,它们都实现了compareTo(..) 方法。
  • Comparable 应该是 Comparable 以与 compareTo(Fruit fruit) 一起使用
  • 如果我想添加多个不同的排序选项,您的方法会是什么样子,例如覆盖 compareTo 方法以按对象名称排序,但添加另一个以按年龄、产品 ID 等排序。等
  • @b101:在这种情况下,您将编写多个比较器,然后在正确的位置插入正确的比较器。比如:Comparator comp1 = new Comparator&lt;Fruit&gt;() { @\Override public int compare(Fruit fruit2, Fruit fruit1) { return fruit1.fruitName.compareTo(fruit2.fruitName); } }); Collection.sort(fruitList, comp1);
【解决方案2】:

从 Apache Commons 尝试 BeanComparator

import org.apache.commons.beanutils.BeanComparator;


BeanComparator fieldComparator = new BeanComparator("fruitName");
Collections.sort(fruits, fieldComparator);

【讨论】:

    【解决方案3】:

    像这样使用Comparator

    List<Fruit> fruits= new ArrayList<Fruit>();
    
    Fruit fruit;
    for(int i = 0; i < 100; i++)
    {
      fruit = new Fruit();
      fruit.setname(...);
      fruits.add(fruit);
    }
    
    // Sorting
    Collections.sort(fruits, new Comparator<Fruit>() {
            @Override
            public int compare(Fruit fruit2, Fruit fruit1)
            {
    
                return  fruit1.fruitName.compareTo(fruit2.fruitName);
            }
        });
    

    现在你的水果列表是根据fruitName排序的。

    【讨论】:

    • 无论是这种方法,使用Comparator,还是@BMT 的使对象实现Comparable 的方法都可以工作。不同之处在于,通过实现Comparable,您是在说排序是对象(如整数或字符串)本质的基本部分,而通过使用Comparator,您是在说在这个特定的上下文,您希望它们以某种方式排序。
    • 排序的顺序呢??升序还是降序??
    • 如果水果名称区分大小写,那么您应该使用 compareToIgnoreCase
    • 我认为在“since java-8”部分给出的答案更简洁:stackoverflow.com/a/2784576/1372202
    • @Silent_Rebel 它在上升。如果要降序排列,则需要在排序后反转列表。这很乏味,同意。
    猜你喜欢
    • 2013-07-05
    • 1970-01-01
    • 2017-02-09
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 2013-08-20
    相关资源
    最近更新 更多