在本教程中,它展示了如何使用java.lang.Comparable和java.util.Comparator根据其属性值对Java对象进行排序。
1.排序数组
要对数组进行排序,请使用Arrays.sort() 。
String[] fruits = new String[] {"Pineapple","Apple", "Orange", "Banana"};
Arrays.sort(fruits);
int i=0;
for(String temp: fruits){
System.out.println("fruits " + ++i + " : " + temp);
}
输出量
fruits 1 : Apple
fruits 2 : Banana
fruits 3 : Orange
fruits 4 : Pineapple
2.排序ArrayList
要对ArrayList进行排序,请使用Collections.sort() 。
List<String> fruits = new ArrayList<String>();
fruits.add("Pineapple");
fruits.add("Apple");
fruits.add("Orange");
fruits.add("Banana");
Collections.sort(fruits);
int i=0;
for(String temp: fruits){
System.out.println("fruits " + ++i + " : " + temp);
}
输出量
fruits 1 : Apple
fruits 2 : Banana
fruits 3 : Orange
fruits 4 : Pineapple
3.对具有可比性的对象进行排序
Java对象呢? 让我们创建一个Fruit类:
public class Fruit{
private String fruitName;
private String fruitDesc;
private int quantity;
public Fruit(String fruitName, String fruitDesc, int quantity) {
super();
this.fruitName = fruitName;
this.fruitDesc = fruitDesc;
this.quantity = 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;
}
}
要对其进行排序,您可能会再次想到Arrays.sort() ,请参见以下示例:
package com.mkyong.common.action;
import java.util.Arrays;
public class SortFruitObject{
public static void main(String args[]){
Fruit[] fruits = new Fruit[4];
Fruit pineappale = new Fruit("Pineapple", "Pineapple description",70);
Fruit apple = new Fruit("Apple", "Apple description",100);
Fruit orange = new Fruit("Orange", "Orange description",80);
Fruit banana = new Fruit("Banana", "Banana description",90);
fruits[0]=pineappale;
fruits[1]=apple;
fruits[2]=orange;
fruits[3]=banana;
Arrays.sort(fruits);
int i=0;
for(Fruit temp: fruits){
System.out.println("fruits " + ++i + " : " + temp.getFruitName() +
", Quantity : " + temp.getQuantity());
}
}
}
不错的尝试,但是,您期望Arrays.sort()会做什么? 您甚至没有提到在Fruit类中排序的内容。 因此,它将遇到以下错误:
Exception in thread "main" java.lang.ClassCastException:
com.mkyong.common.Fruit cannot be cast to java.lang.Comparable
at java.util.Arrays.mergeSort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
要按对象的属性对对象进行排序,必须使对象实现Comparable接口并重写compareTo()方法。 让我们再次看到新的Fruit类。
public class Fruit implements Comparable<Fruit>{
private String fruitName;
private String fruitDesc;
private int quantity;
public Fruit(String fruitName, String fruitDesc, int quantity) {
super();
this.fruitName = fruitName;
this.fruitDesc = fruitDesc;
this.quantity = 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;
}
public int compareTo(Fruit compareFruit) {
int compareQuantity = ((Fruit) compareFruit).getQuantity();
//ascending order
return this.quantity - compareQuantity;
//descending order
//return compareQuantity - this.quantity;
}
}
新的Fruit类实现了Comparable接口,并重写了compareTo()方法以按升序比较其数量属性。
compareTo()方法很难解释,在整数排序中,请记住
- this.quantity – compareQuantity是升序。
- compareQuantity –此数量是降序。
要了解有关compareTo()方法的更多信息,请阅读此Comparable文档 。
再次运行它,现在Fruits数组将按其数量升序排序。
fruits 1 : Pineapple, Quantity : 70
fruits 2 : Orange, Quantity : 80
fruits 3 : Banana, Quantity : 90
fruits 4 : Apple, Quantity : 100
4.使用比较器对对象进行排序
用Fruit的“ fruitName”或“ Quantity”排序怎么样? Comparable接口仅允许对单个属性进行排序。 要使用多个属性进行排序,您需要Comparator 。 再次查看新的更新的Fruit类:
import java.util.Comparator;
public class Fruit implements Comparable<Fruit>{
private String fruitName;
private String fruitDesc;
private int quantity;
public Fruit(String fruitName, String fruitDesc, int quantity) {
super();
this.fruitName = fruitName;
this.fruitDesc = fruitDesc;
this.quantity = 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;
}
public int compareTo(Fruit compareFruit) {
int compareQuantity = ((Fruit) compareFruit).getQuantity();
//ascending order
return this.quantity - compareQuantity;
//descending order
//return compareQuantity - this.quantity;
}
public static Comparator<Fruit> FruitNameComparator
= new Comparator<Fruit>() {
public int compare(Fruit fruit1, Fruit fruit2) {
String fruitName1 = fruit1.getFruitName().toUpperCase();
String fruitName2 = fruit2.getFruitName().toUpperCase();
//ascending order
return fruitName1.compareTo(fruitName2);
//descending order
//return fruitName2.compareTo(fruitName1);
}
};
}
Fruit类包含一个静态的FruitNameComparator方法来比较“ fruitName”。 现在,Fruit对象可以使用“ quantity”或“ fruitName”属性进行排序。 再次运行。
1.根据水果数组的“ fruitName”属性以升序对它进行排序。
Arrays.sort(fruits, Fruit.FruitNameComparator);
输出量
fruits 1 : Apple, Quantity : 100
fruits 2 : Banana, Quantity : 90
fruits 3 : Orange, Quantity : 80
fruits 4 : Pineapple, Quantity : 70
2.根据水果数组的“数量”属性以升序对其进行排序。
Arrays.sort(fruits)
输出量
fruits 1 : Pineapple, Quantity : 70
fruits 2 : Orange, Quantity : 80
fruits 3 : Banana, Quantity : 90
fruits 4 : Apple, Quantity : 100
java.lang.Comparable和java.util.Comparator功能强大,但是花一些时间来理解和使用它,可能是由于缺少详细的示例。
我的想法…
将来,Arrays类应该提供更多通用且方便的方法– Arrays.sort(Object,String,flag) 。
按其“ fruitName”升序对对象数组进行排序。
Arrays.sort(fruits, fruitName, Arrays.ASCENDING);
按照对象数组的“数量”以升序对其进行排序。
Arrays.sort(fruits, quantity, Arrays.DESCENDING);
参考
翻译自: https://mkyong.com/java/java-object-sorting-example-comparable-and-comparator/