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

时间:2013-11-12 18:58:04

标签: java sorting arraylist

我已经定义了一个arrayList

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

使用

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

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

5 个答案:

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

        }

}