2

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

4

6 回答 6

5

您可以通过提供自定义Comparator进行排序。您不需要实现Comparable

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

如果您想以不同于自然顺序的顺序对某些对象进行排序怎么办?或者如果你想对一些没有实现 Comparable 的对象进行排序呢?

于 2012-11-21T10:42:24.070 回答
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();
}
}
于 2012-11-21T10:44:27.607 回答
2

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

public class Person {

    private String name;

    public String getName() {
        return name;
    }

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

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

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

看看这里

于 2012-11-21T10:56:46.697 回答
1

-您的类不需要实现Comparable,而是自定义java.util.Comparator。

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

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

例如:

Collections.sort(List l , Comparator c)

-当我们想根据一个对象的 多个属性对Comparator对象进行排序时,它也非常有用。

于 2012-11-21T10:44:20.977 回答
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
于 2012-11-21T10:47:50.653 回答
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());
于 2012-11-21T10:50:55.910 回答