对基于类的ArrayList进行排序?

时间:2015-05-13 19:52:37

标签: java sorting arraylist

我有一个基于以下类的LastList和First Names组成的ArrayList:

package nameSorting;

import javax.swing.JPanel;

public class Person extends JPanel{

    private String firstName;
    private String lastName;

    public void enterLast(String string){
        lastName = string;
    }
    public void enterFirst(String string){
        firstName = string;
    }
    public String firstName(){
        return firstName;
    }
    public String lastName(){
        return lastName;
    }
    @Override
    public String toString(){
        return firstName + " , " + lastName;
    }
}

我对ArrayList的声明如下(我在另一个类中这样做):

private ArrayList<Person> savedNames = new ArrayList<Person>();

然后我尝试做Collections.sort,但它说我需要一个比较器。我试图查找如何使用它,但似乎没有什么对我的情况有帮助,因为他们都排序数字,我试图按字符排序。

我的目标是按字母顺序基于姓氏对ArrayList进行排序。所以首先是A-Z,然后还有另一种选择来排序Z-A。关于如何使这项工作的任何想法?

3 个答案:

答案 0 :(得分:1)

Collections.sort(savedNames, (Person p1, Person p2) -> p1.lastName().compareTo(p2.lastName());

答案 1 :(得分:1)

您可以通过在Comparable课程中实施Person界面来实现这一目标:

public class Person extends JPanel implements Comparable {

    ...

    @Override
    public int compareTo(Person other) {
        return this.lastName.compareTo(other.lastName());
    }

}

(未经测试的代码)在这种情况下,我只是将比较委托给姓氏,因此人员将按姓氏排序。您可以在compareTo中写下您写的任何内容。它只需要返回一个int&lt; 0,== 0或&gt; 0来确定哪个对象被认为是“更小”。

但是,Collections.sort()可用于未实现Comparable接口的对象列表。在这种情况下,您需要为函数调用实现Comparator。最优雅的方法是使用lambda(Java 8+,复制自Jean-FrançoisSavard的答案):

Collections.sort(savedNames, (Person p1, Person p2) ->
    p1.lastName().compareTo(p2.lastName())
);

没有lambda:

Collections.sort(savedNames, new Comparator<Person>() {
    public int compare(Person p1, Person p2) {
        return p1.lastName().compareTo(p2.lastName());
    }
});

(也未经测试)

答案 2 :(得分:0)

您只需要通过实施Person界面或外部Comparable在类型Comparator上创建订单。

class Person implements Comparable<Person> {
    @Override
    public compareTo(Person that) {
        // this is a reasonible implementation, but you can have your own
        return String.CASE_INSENSITIVE_ORDER.compare(this.lastName(),that.lastName());
    }
}

这样做是在Person上定义自然顺序。这样,您在排序数据时就不必提供Comparator。但是,您只能有一个自然顺序,并且您可能需要在某些时候使用Person实例之间的比较的不同实现。

在这种情况下,请定义新的Comparator

Collections.sort(persons, new Comparator<Person> () {
    @Override
    public int compare(Person p1, Person p2) {
        return p1.getAge() - p2.getAge();
    }
});

这是Java x&lt; = 7方式,在Java 8中你可以找到:

persons.stream().sorted((p1,p2) -> p1.getAge() - p2.getAge()).collect(Collectors.toList());