Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对基于类的ArrayList进行排序?_Java_Sorting_Arraylist - Fatal编程技术网

Java 对基于类的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;

我有一个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 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());