使用java集合对Person的ArrayList进行排序

Dav*_*ell 8 java sorting collections io

在我使用的代码下面工作正常并输出名称,除了sort方法不起作用.我期待"Collections.sort(nameFromText);" 按名字按字母顺序对ArrayList进行排序.

我究竟做错了什么?

public static void main(String[] args) throws IOException {
    // Create and populate text file
    Writer textFile = new FileWriter("names.txt");
    String[] nameArray = new String[] { "Tina Tully\n", "Bill Simpson\n",
            "Dana Smith\n", "Ralph Andrews\n", "Greg Smithers\n",
            "Lisa Krump\n", "Gill Bitters\n", "Barbara West\n",
            "Sandra McDonald\n", "Bart Willis\n", "Bucky Zimmerman\n",
            "Richard Vicks\n", "Velma Tarp\n", "Winslow Tunnell\n",
            "Andrew Letterman\n", "Betty Trump\n", "Waldo Smith\n",
            "Kyle Ronno\n", "Vivian West\n", "Wendy Tunnell\n" };
    generateText(textFile, nameArray);

    // Create object of previously created text file
    Scanner pullFile = new Scanner(new File("names.txt"));

    // Create 20 Person Objects and add to ArrayList data structure with
    // name variables assigned to values from text file
    ArrayList<Person> nameFromText = new ArrayList<Person>();
    fillArrayList(nameFromText, pullFile);

    // Sort ArrayList
    Collections.sort(nameFromText);

    // Print ArrayList
    printNamesFromObjects(nameFromText);
}

private static void printNamesFromObjects(ArrayList<Person> namesFromText) {
    for (int i = 0; i < 20; i++) {
        System.out.println(namesFromText.get(i).name);
    }
}

private static void fillArrayList(ArrayList<Person> nameFromText,
        Scanner pullFile) {
    while (pullFile.hasNext()) {
        Person obj = new Person(pullFile.nextLine());
        nameFromText.add(obj);
    }
}

private static void generateText(Writer textFile, String[] nameArray)
        throws IOException {
    for (int i = 0; i < 20; i++) {
        textFile.write(new String(nameArray[i]));
    }
    textFile.close();
}
Run Code Online (Sandbox Code Playgroud)

Roh*_*ain 28

Collections.sort(List<T>)method期望它排序的列表元素具有可比性.元素类型T应该实现Comparable接口,或者您应该使用sort()带有泛型Comparator实例的重载方法.

在下面的代码中,您既不满足上述条件.你的Person类既没有实现Comparable,也没有传递任何Comparator实例.

ArrayList<Person> nameFromText = new ArrayList<Person>();
fillArrayList(nameFromText, pullFile);
// Sort ArrayList
Collections.sort(nameFromText);  // How to sort?
Run Code Online (Sandbox Code Playgroud)

你应该Comparator为你的Person类创建一个告诉sort()方法如何对它进行排序(可能在存储在Person类中的String上)

以下是如何实现通用比较器:

public class PersonNameComparator implements Comparator<Person> {
    public int compare(Person p1, Person p2) {
        return p1.getName().compareTo(p2.getName());
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你的Collections.sort()方法调用应该像: -

Collections.sort(nameFromText, new PersonNameComparator());
Run Code Online (Sandbox Code Playgroud)