Java 集合排序(Java Collections sort())
今天我们将研究Java的集合排序方法。在使用Java的集合时,往往需要对数据进行排序。
Java Collections sort() 可以用中文這樣來表達:對 Java 集合進行排序。
Java的Collections类为我们提供了一个非常方便的方法Collections.sort(),可以对所有List实现(如LinkedList和ArrayList)进行排序。有两个重载的Collections.sort()方法,它们是:
-
- 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);
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按升序对元素进行排序。如果我们想要以相反的顺序排序元素,可以使用以下方法:
-
- 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文档。