我已经定义了一个arrayList
这些对象中的每一个都有自己的名称等。我想按类型对它们进行排序,所以所有的西瓜都在一起,梨也在一起等等。然后每次按字母顺序对它们进行排序。
使用的东西
public int compare(String[] first, String[] second) {
return first[1].compareTo(second[1]);
}
也可以在已经创建的类中执行此操作,以避免在新类中执行此操作。
关闭,但您将无法将String
数组作为参数传递给 compare 方法。您需要创建一个Comparator<Food>
并且参数将是Food
引用。
然后在compare(Food f1, Food f2)
方法中你需要比较类,如果它们相同,那么名称。
你很接近。您可以执行以下操作(一次性使用匿名Comparator
接口实现,因此您不需要新类):
Collections.sort(foodList, new Comparator<Food>() {
@Override
public int compare(Food food1, Food food2) {
int result = 0;
if(food1.getType().equals(food2.getType())) {
result = food1.getName().compareTo(food2.getName());
} else {
result = food1.getType().compareTo(food2.getType());
}
return result;
}
});
另一种方法是Food
实现Comparable<T>
并使用相同的compareTo(T o)
实现逻辑。
比较首先检查食物的类型是否相同(假设食物类型有适用的equals()
方法)。如果它们相等,则需要根据它们的名称进行比较。否则,将根据食物类型进行比较。
您可以在您的实现或子类中实现该Comparable
接口。Food
尽管编写适合您的情况的实现很容易,但编写一个完全正确的Comparable
实现并不像看起来那么简单,尤其是在继承方面。有关需求和常见陷阱的良好文档,请参阅Effective Java ,第 12 项。
您的比较方法名称错误。这将是 Comparable 接口的 compareTo。:
public int compareTo(Fruit second) {
return this.getWaterMelon().compareTo(second.getWaterMelon());
}
我想说您的compare()
方法需要为您的type
compareTo() 差异 + name
compareTo() 差异返回加权值。
就像是
public int compare(Food food1, Food food2) {
int result = 0;
result = food1.getType().compareTo(food2.getType()) * someMultiplier + food1.getName().compareTo(food2.getName());
return result;
}
编辑:这是我建议的用法......
public class ComparatorTest {
static class ComaparableObject implements Comparable {
private Object value1;
private Object value2;
public ComaparableObject(Object value1, Object value2) {
this.value1 = value1;
this.value2 = value2;
}
@Override
public int compareTo(Object o) {
int multiplier = 65535;
ComaparableObject co = (ComaparableObject) o;
int result = (value1.hashCode() * multiplier + value2.hashCode()) - (co.value1.hashCode() * multiplier + co.value2.hashCode()) ;
return result;
}
public Object getValue1() {
return value1;
}
public void setValue1(Object value1) {
this.value1 = value1;
}
public Object getValue2() {
return value2;
}
public void setValue2(Object value2) {
this.value2 = value2;
}
public String toString() {
String result = "value1=" + value1 + ", " + "value2=" + value2;
return result;
}
}
public static void main(String[] args) {
ArrayList<ComaparableObject> al;
al = new ArrayList<ComaparableObject>();
ComaparableObject co;
int value1 = 2;
co = new ComaparableObject(value1, 3);
al.add(co);
co = new ComaparableObject(value1, 1);
al.add(co);
co = new ComaparableObject(value1, 2);
al.add(co);
value1 = 1;
co = new ComaparableObject(value1, 3);
al.add(co);
co = new ComaparableObject(value1, 1);
al.add(co);
co = new ComaparableObject(value1, 2);
al.add(co);
System.out.println("Before sort: " + al);
Collections.sort(al, new Comparator<ComaparableObject>() {
@Override
public int compare(ComaparableObject co1, ComaparableObject co2) {
int result;
result = co1.compareTo(co2);
return result;
}
});
System.out.println("After sort: " + al);
}
}