Java 集合排序(Java Collections sort())

今天我们将研究Java的集合排序方法。在使用Java的集合时,往往需要对数据进行排序。

Java Collections sort() 可以用中文這樣來表達:對 Java 集合進行排序。

Java的Collections类为我们提供了一个非常方便的方法Collections.sort(),可以对所有List实现(如LinkedList和ArrayList)进行排序。有两个重载的Collections.sort()方法,它们是:

    1. sort(List list): 对List中的元素按照它们的自然顺序进行升序排序。

 

    sort(List list, Comparator c): 根据比较器所指定的顺序,对列表中的元素进行排序。

请注意,上述方法的签名中使用了泛型,但由于阅读简便性,我在此处将其删除。让我们逐一深入研究如何以及何时可以同时使用这两种方法。

Java集合排序(List列表)

考虑一个字符串的ArrayList:

List<String> fruits = new ArrayList<String>();
fruits.add("Apple");
fruits.add("Orange");
fruits.add("Banana");
fruits.add("Grape");

现在,我们将使用Collections.sort()对它进行排序。

Collections.sort(fruits);
// Print the sorted list
System.out.println(fruits);

这个程序的输出结果将是:

[Apple, Banana, Grape, Orange]

因此,我们可以看到Collections.sort()已经按照字典顺序对字符串列表进行了排序。而且它不会返回任何东西。那么如果我们有一个自定义的对象列表呢?当然,我们也可以对它们进行排序。考虑一个名为Fruit的类。

package com.Olivia.collections;
public class Fruit{
    private int id;
    private String name;
    private String taste;

    Fruit(int id, String name, String taste){
        this.id=id;
        this.name=name;
        this.taste=taste;
    }
}

让我们创建一个水果清单吧。 ba.)

List<Fruit> fruitList=new ArrayList<Fruit>();
Fruit apple=new Fruit(1, "Apple", "Sweet");
Fruit orange=new Fruit(2, "Orange", "Sour");
Fruit banana=new Fruit(4, "Banana", "Sweet");
Fruit grape=new Fruit(3, "Grape", "Sweet and Sour");

fruitList.add(apple);
fruitList.add(orange);
fruitList.add(banana);
fruitList.add(grape);
java collections sort, Java Collections.sort() method
package com.Olivia.collections;
public class Fruit implements Comparable<Object>{
    private int id;
    private String name;
    private String taste;

    Fruit(int id, String name, String taste){
        this.id=id;
        this.name=name;
        this.taste=taste;
    }
    @Override 
    public int compareTo(Object o) {
        Fruit f = (Fruit) o; 
        return this.id - f.id ;
    }
}

现在我们已经实现了Comparable接口,所以我们可以在没有任何错误的情况下对列表进行排序。

Collections.sort(fruitList);
fruitList.forEach(fruit -> {
    System.out.println(fruit.getId() + " " + fruit.getName() + " " + 
      fruit.getTaste());
});

输出结果如下:

1 Apple Sweet
2 Orange Sour
3 Grape Sweet and Sour
4 Banana Sweet

Java Collections 类库中的 sort(List list, Comparator c) 方法用于对列表进行排序,其中参数 c 是用于确定排序顺序的比较器。

为了定义一个自定义的排序逻辑,该逻辑不同于元素的自然排序,我们可以实现java.util.Comparator接口,并将其实例作为sort()的第二个参数传递进去。让我们考虑一下,我们希望根据水果的“名称”字段来定义排序顺序。我们实现了Comparator,并在其compare()方法中编写比较逻辑。

package com.Olivia.collections;

class SortByName implements Comparator<Fruit> {
    @Override
    public int compare(Fruit a, Fruit b) {
        return a.getName().compareTo(b.getName());
    }
}

现在,我们可以使用这个比较器进行排序。

Collections.sort(fruitList, new SortByName());

输出将如下所示。

1 Apple Sweet
4 Banana Sweet
3 Grape Sweet and Sour
2 Orange Sour

不需要为Comparator写新的类,我们可以使用lambda函数来在运行时提供排序逻辑。

Collections.sort(fruitList, (a, b) -> {
    return a.getName().compareTo(b.getName());
});

Java集合.reverseOrder

默认情况下,Collection.sort按升序对元素进行排序。如果我们想要以相反的顺序排序元素,可以使用以下方法:

    1. reverseOrder(): 返回一个比较器,该比较器实施集合中元素的自然顺序的反向排序。

 

    reverseOrder(Comparator cmp): 返回一个比较器,该比较器实施指定比较器的反向排序。

以下是这两种方法的例子:

Java集合reverseOrder()示例。

请提供一个选项

Collections.sort(fruits, Collections.reverseOrder());
System.out.println(fruits);

它将按照字母的相反顺序输出水果。

[Orange, Grape, Banana, Apple]

Java集合reverseOrder(Comparator cmp)示例

Collections.sort(fruitList, Collections.reverseOrder(new SortByName()));
fruitList.forEach(fruit -> {
    System.out.println(fruit.getId() + " " + fruit.getName() + " " + 
      fruit.getTaste());
});

输出:结果

2 Orange Sour
3 Grape Sweet and Sour
4 Banana Sweet
1 Apple Sweet

这就是关于Java集合sort()方法及其示例的全部内容。参考:API文档。

广告
将在 10 秒后关闭
bannerAds