0

我已经定义了一个arrayList

这些对象中的每一个都有自己的名称等。我想按类型对它们进行排序,所以所有的西瓜都在一起,梨也在一起等等。然后每次按字母顺序对它们进行排序。

使用的东西

public int compare(String[] first, String[] second) {
    return first[1].compareTo(second[1]);
}

也可以在已经创建的类中执行此操作,以避免在新类中执行此操作。

4

5 回答 5

3

关闭,但您将无法将String数组作为参数传递给 compare 方法。您需要创建一个Comparator<Food>并且参数将是Food引用。

然后在compare(Food f1, Food f2)方法中你需要比较类,如果它们相同,那么名称。

于 2013-11-12T19:00:39.967 回答
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()方法)。如果它们相等,则需要根据它们的名称进行比较。否则,将根据食物类型进行比较。

于 2013-11-12T19:02:47.237 回答
0

您可以在您的实现或子类中实现该Comparable接口。Food尽管编写适合您的情况的实现很容易,但编写一个完全正确的Comparable实现并不像看起来那么简单,尤其是在继承方面。有关需求和常见陷阱的良好文档,请参阅Effective Java ,第 12 项。

于 2013-11-12T19:02:55.717 回答
0

您的比较方法名称错误。这将是 Comparable 接口的 compareTo。:

public int compareTo(Fruit second) {
 return this.getWaterMelon().compareTo(second.getWaterMelon());
}
于 2013-11-12T19:02:57.643 回答
-1

我想说您的compare()方法需要为您的typecompareTo() 差异 + namecompareTo() 差异返回加权值。
就像是

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);

        }

}
于 2013-11-12T19:14:13.873 回答