我已经定义了一个arrayList
这些对象中的每一个都有自己的名称等。 我想按类型对它们进行排序,所以所有的西瓜都在一起,梨在一起等等,然后在每次按字母顺序排序。
使用
的东西public int compare(String[] first, String[] second) {
return first[1].compareTo(second[1]);
}
也可以在已经创建的类中执行此操作,以避免在新类中执行此操作。
答案 0 :(得分:3)
关闭,但您无法将String
数组作为参数传递给compare方法。您需要创建Comparator<Food>
,参数将为Food
引用。
然后在compare(Food f1, Food f2)
方法中,您需要比较该类,如果它们相同,那么就是名称。
答案 1 :(得分:2)
你非常接近。你可以做这样的事情(一次性使用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()
方法)。如果它们相等,则需要根据它们的名称进行比较。否则,将根据食物类型进行比较。
答案 2 :(得分:0)
您可以在Comparable
实现或子类中实现Food
接口。尽管编写适用于您的案例的实现很容易,但它并不像编写完全正确的Comparable
实现那样简单,特别是关于继承。请参阅 Effective Java ,第12项,以获得有关要求和常见陷阱的良好文档。
答案 3 :(得分:0)
您的比较方法名称错误。它将比较可比较的接口。:
public int compareTo(Fruit second) {
return this.getWaterMelon().compareTo(second.getWaterMelon());
}
答案 4 :(得分:-1)
我想说你的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);
}
}