Java 对基于类的ArrayList进行排序?
我有一个ArrayList,它由姓氏和名字组成,基于以下类:Java 对基于类的ArrayList进行排序?,java,sorting,arraylist,Java,Sorting,Arraylist,我有一个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;
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 savedNames=new ArrayList();
然后我试着做Collections.sort,但它说我需要一个比较器。我试图查找如何使用它,但似乎对我的情况没有任何帮助,因为它们都是按数字排序的,我正在尝试按字符排序
我的目标是根据姓氏的字母顺序对ArrayList进行排序。首先是A-Z,然后还有另一个选项来排序Z-A。关于如何实现这一点,有什么想法吗 您可以通过在
Person
类中实现Comparable
接口来实现这一点:
Collections.sort(savedNames, (Person p1, Person p2) -> p1.lastName().compareTo(p2.lastName());
public class Person extends JPanel implements Comparable {
...
@Override
public int compareTo(Person other) {
return this.lastName.compareTo(other.lastName());
}
}
(代码未经测试)在本例中,我只是将比较委托给姓氏,因此人员将按姓氏排序。您可以将写入的任何内容写入比较器
。它只需要返回一个int 0来确定哪个对象被认为“更小”
但是,Collections.sort()
可用于未实现类似接口的对象列表。在这种情况下,您需要为函数调用实现一个比较器。最优雅的方法是使用lambda(Java 8+,摘自Jean-François Savard的答案):
没有lambda:
Collections.sort(savedNames, new Comparator<Person>() {
public int compare(Person p1, Person p2) {
return p1.lastName().compareTo(p2.lastName());
}
});
Collections.sort(savedNames,newcomparator(){
公共整数比较(人员p1、人员p2){
返回p1.lastName().compareTo(p2.lastName());
}
});
(也未经测试)您只需通过实现
Comparable
界面或外部比较器,在您的类型Person
上创建订单即可
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());
}
}
这是用JavaX写的,你读过吗?是的,我读过,但我从来没有真正理解过oracle文档。当我开始使用ArrayList时也发生了同样的事情,我必须找到其他人如何使用它们的例子,因为我发现预言令人困惑,也很难模仿。不过谢谢你,我会把那页加入书签。那是一个快速的否决票。答案有什么问题?一行代码,没有解释,应该注意,这只在java 8中有效,但它是一个有效的答案,不依赖于实现Compariable,这并不总是可能的答案是好的。也许可以解释一下你在这里做了什么,以及OP如何根据自己的需要进行更多的修改。@Dici看起来像是在浪费-1个代表,但这只是我的看法。我不确定有多少要解释。这不一定是真的,你必须实现可比的。完整的答案应该包括集合。排序(集合,比较)
。有时您无法修改原始源代码,有时您希望能够按不同的属性进行排序,在这种情况下,Collections.sort()
是一个更好的选择,这是正确的。lambdas这样做可能是最普遍、最优雅的方式。我修改了我的答案,以确保真正的完整性—使用匿名内部类(1.8之前的方式)的实现也会很好地显示出来,因为很多人仍然使用1.7。但这更好:)我尝试了不使用lambda的方法,因为我必须为1.7编译(大学计算机仍然使用1.7…),虽然它不会给出任何编译器错误,但实际上它不会对列表进行排序。有什么东西我必须修改以匹配我的代码吗?这是必要的,因为匿名类隐式地是一个声明。因此,它本质上与尝试执行类Foo实现Comparator{…}
相同。我没有试图编译它,我只是看到了错误也许Jean的简短回答也有理由。@Dici我对你的第二个片段很好奇,为什么你要把列表转换成流,然后排序,然后再转换成列表?为什么不像我那样直接分类呢?这不是sorted
要使用的内容。此外,OP说他想根据姓氏而不是年龄进行排序。另外,为什么不直接调用compareTignoreCase
而不是字符串。不区分大小写顺序。compare
?注释不用于扩展讨论;这段对话已经结束。
Collections.sort(savedNames, new Comparator<Person>() {
public int compare(Person p1, Person p2) {
return p1.lastName().compareTo(p2.lastName());
}
});
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());
}
}
Collections.sort(persons, new Comparator<Person> () {
@Override
public int compare(Person p1, Person p2) {
return p1.getAge() - p2.getAge();
}
});
persons.stream().sorted((p1,p2) -> p1.getAge() - p2.getAge()).collect(Collectors.toList());