将 ArrayList 排序为对象类型,然后按字母顺序排序



我定义了一个数组列表

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

使用的东西

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

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

关闭,但您将无法将String数组作为参数传递给比较方法。您需要创建一个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()方法)。如果它们相等,则需要根据它们的名称进行比较。否则,将根据食物类型进行比较。

您可以在Food实现或子类中实现Comparable接口。 虽然编写适合您的情况的实现很容易,但它并不像编写完全正确的Comparable实现那样微不足道,尤其是在继承方面。 请参阅有效的 Java,第 12 项,以获取有关需求和常见陷阱的良好文档。

您的比较方法名称错误。它将与可比较的接口进行比较。

public int compareTo(Fruit second) {
 return this.getWaterMelon().compareTo(second.getWaterMelon());
}
我想

说的是,您的compare()方法需要返回您的type比较To()差异+name比较To()差异的加权值。
类似的东西

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

最新更新