如何在Java中对ArrayList进行排序

226

我有一个名为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);
}

我需要使用列表中每个对象的水果名称来对该ArrayList进行排序。

怎样做?


尝试这个:https://dzone.com/articles/sorting-java-arraylist - Abhishek Thapliyal
3个回答

427

使用类似这样的 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排序的。


71
使用“Comparator”或@BMT的方法,让对象实现“Comparable”都可以工作。区别在于通过实现“Comparable”,您表示排序是对象本质的一个基本部分(例如整数或字符串),而使用“Comparator”,则表示在这个特定的上下文中,您希望按照某种方式对它们进行排序。 - Tom Anderson
6
排序的顺序是什么?升序还是降序? - Silent_Rebel
3
如果水果名称区分大小写,那么应该使用compareToIgnoreCase。 - user2977578
1
@Silent_Rebel 这是升序排列。如果你想要降序排列,需要在排序后将列表反转。这很繁琐,我同意。 - Alexis Dufrenoy
对于从Google来的人,请参见此处:https://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html 文档中写道,“比较其两个参数的顺序。如果第一个参数小于、等于或大于第二个参数,则返回负整数、零或正整数。”请注意,您还可以使用例如Integer.compare(int a, int b)。 - Andrew
显示剩余2条评论

92

实现 Comparable 接口到 Fruit。

public class Fruit implements Comparable<Fruit> {

它实现了这个方法。

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

然后调用sort方法

Collections.sort(fruitList);

8
Collections.sort(..)也适用于ArrayList<T>,其中T可以是IntegerLongString等类型,这些类型都已经实现了它们自己的compareTo(..)方法。 - Evgeni Sergeev
13
为了让 compareTo(Fruit fruit) 正常工作,应将 Comparable 修改为 Comparable<Fruit>。 - Droid Chris
如果我想添加多个不同的排序选项,例如覆盖compareTo方法以按对象名称排序,但又想添加按年龄、产品ID等排序选项,您的方法会是什么样子? - b101
2
在这种情况下,您需要编写多个比较器,并在正确的位置插入正确的比较器。类似于: Comparator comp1 = new Comparator<Fruit>() { @Override public int compare(Fruit fruit2, Fruit fruit1) { return fruit1.fruitName.compareTo(fruit2.fruitName); } }); Collection.sort(fruitList, comp1); - kaba713

14

尝试使用Apache Commons中的BeanComparator

import org.apache.commons.beanutils.BeanComparator;


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接