Java排序用户定义的对象

时间:2012-11-21 10:40:40

标签: java

我想对对象集合进行排序,它没有实现可比较或比较的接口。问题是我无法改变类设计,因为我只有.class(没有源代码)文件。我怎么能做到这一点?

6 个答案:

答案 0 :(得分:5)

您可以通过提供自定义Comparator进行排序。您无需实施Comparable

请参阅Collections.sort(List s, Comparator c)Collections ordering tutorial - 特别是标有 Comparators 的部分:

  

如果您想要按照除了它们之外的顺序对某些对象进行排序,该怎么办?   自然排序?或者如果你想要排序一些没有的对象   实现可比较的?

答案 1 :(得分:3)

您可以使用比较器

public class ExampleComparator {
public static void main(String[] args) {

    List<Person> list = new ArrayList<Person>();
    list.add(new Person("shyam",24));
    list.add(new Person("jk",29));
    list.add(new Person("paul",30));
    list.add(new Person("ashique",4));
    list.add(new Person("sreeraj",14));
    for (Person person : list) {
        System.out.println(person.getName()+ "   "+ person.getAge());
    }
    Collections.sort(list,new PersonComparator());
    System.out.println("After sorting");
    for (Person person : list) {
        System.out.println(person.getName()+ "   "+ person.getAge());
    }
}
}




public class Person {
private int age;
private String name;

Person (String name, int age){
    setName(name);
    setAge(age);
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
}

public class PersonComparator implements Comparator<Person> {

@Override
public int compare(Person obj1, Person obj2) {
    return obj1.getAge() - obj2.getAge();
}
}

答案 2 :(得分:2)

假设您需要对Person个对象列表进行排序:

public class Person {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

它不必实现可比较比较器接口。你可以这样排序:

public void someTest() {
    LinkedList<Person> persons = new LinkedList<Person>();
    persons.add(new Person());
    //add as many as you want
    Collections.sort(persons, new Comparator<Person>() {
        @Override
        public int compare(Person o1, Person o2) {
            return o1.getName().compareTo(o2.getName());
        }
    });
}

看看here

答案 3 :(得分:1)

- 您的课程不需要实施Comparable,而是自定义 java.util.Comparator。

- 原因Comparator 就像比较要比较对象的类之外的对象。

- 您需要使用Collections's方法sort()

<强>例如

Collections.sort(List l , Comparator c)

- Comparator在我们希望基于对其中一个属性进行排序时非常有用。

答案 4 :(得分:1)

让我们说你的班级看起来更像这样:

class Test {
    public int amount; //field u want to compare

    // ...

}

为此课程编写自定义比较器:

class TestAmountComparator implements Comparator<Test> {
    @Override
    public int compare(Test t1, Test t2) {
        return Integer.valueOf(t1.amount).compareTo(Integer.valueOf(t2.amount))          
    }
}

要对对象列表进行排序:

List<Test> list = new ArrayList<Test>(myTest); //your Test list
//sorting
Collections.sort(list, new TestAmountComparator()); //sort by amount

答案 5 :(得分:1)

可以使用自定义Comparator对集合进行排序 (例如:如果您有班级电话Person,并且您想根据此人的年龄进行排序)

public class CustomComparator implements Comparator<Person>{

    @Override
    public int compare(Person o1, Person o2) {
        if (o1.getAge() < o2.getAge()){
            return 1;
        }else{
            return 0;
        }
    }
}

然后您可以使用此自定义比较器

对人员列表进行排序
Collections.sort(list, new CustomComparator());