我有一个基于以下类的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。关于如何使这项工作的任何想法?
答案 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());