如何按字母顺序对字符串的ArrayList进行排序?

3
我正在尝试创建一个可以按字母顺序对ArrayList内容进行排序的程序。目前,我的程序中有三个类...

Dog

public class Dog {
    private String name;

    public Dog(){

    }

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

    public String getName(){
        return this.name;
    }
}
是一个包含类型为的ArrayList的对象。
import java.util.ArrayList;

public class DogList {

    private ArrayList<Dog> dogList;

    public DogList(){
        DogList = new ArrayList<>();
    }

    public void setSize(int DogSize){
        for(int x = 0; x <= DogSize; x++){
            DogList.add(new Dog());
        }
    }

    public ArrayList<Dog> getList(){
        return dogList;
    }
}

最后一个类是DogSorter,它试图访问DogList ArrayList,然后尝试按字母顺序对该ArrayList的内容进行排序。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;


public class DogSorter {
    private DogList list = new DogList();

    public void sortDogs{
        Collections.sort(list);
    }

    for(i = 0; i < list.length(); i++) {
        System.out.println(list.getList().get(i).getName();
    }
}

很抱歉这篇文章有点长。我的问题很简单:如何准确地对ArrayList的内容进行排序?我一直收到一个错误,说我正在尝试使用“Collections.sort”行比较错误的类型。如果有人能帮忙,请告诉我。谢谢。

编辑:为了明确起见,我试图按每个对象中存储的getName()字符串按字母顺序排序。


顺便问一下,为什么你发布的代码明显不是你正在使用的代码?请避免这样做。 - Tom
7个回答

8
使用
Collections.sort(dogList, new Comparator<Dog>(){
    public int compare(Dog d1, Dog d2){
         return d1.getName().compareTo(d2.getName());
    }    
});

这将基于比较器比较每只狗。比较器仅仅比较狗的名字。
更新:对于惯用的Java 8风格。
Collections.sort(dogList, (d1,d2) -> d1.getName().compareTo(d2.getName()));

7

请按照以下方式进行操作,不要让代码变得太复杂。我看到你的代码有些混乱,这使得理解起来更加困难。

请遵循这种最简单的方法,以升序/降序方式对 Dog 对象列表进行排序。

import java.util.ArrayList;
import java.util.Collections;


class Dog implements Comparable<Dog>{
    String name;

    Dog(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public int compareTo(Dog o) {
        return this.name.compareTo(o.getName()); // dog name sort in ascending order 
        //return o.getName().compareTo(this.name); use this line for dog name sort in descending order 
    }

    @Override
    public String toString() {
        return this.name;
    }
}


public class DogSort {

    public static void main(String[] args) {
        ArrayList<Dog> listDog = new ArrayList<Dog>();
        listDog.add(new Dog("doggy"));
        listDog.add(new Dog("aaa"));
        listDog.add(new Dog("bbb"));
        System.out.println(listDog);
        Collections.sort(listDog);
        System.out.println(listDog);

    }

}

4

您可以使用以下方式对其进行排序:

  Collections.sort(list);

2
对于原帖作者来说没有帮助,因为他已经这样做了... - Tom

2

你在类和变量中使用了相同的名称DogList,请更改它。

例如:

private ArrayList<Dog> innerList;

在你的DogList类中,声明一个排序方法。
public sort() { 
Collections.sort(innerList);
}

你的 Dog 类必须是可比较的。

public class Dog implements Comparable {

public int compareTo(Object _other)
{
// DO the comparaison
return 1;
}

}

你正在使用原始类型,因为...? - Tom

2
你需要实现Comparator接口。

2

你的建议应该如何实现?list既不是数组,也不包含数组。 - Tom

1
要么在你的Dog类中实现Comparable接口,要么编写一个自定义的Comparator来按名称对Dog进行排序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接