8

私が使用しているコードの下では、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();
}
4

5 に答える 5

28

Collections.sort(List<T>)メソッドは、ソートしているリストの要素が比較可能であることを期待しています。要素タイプはインターフェースTを実装する必要があります。または、ジェネリックインスタンスを取得するオーバーロードされたメソッドを使用する必要があります。Comparablesort()Comparator

以下のコードでは、上記のいずれの条件も満たしていません。Personクラスは実装しておらず、インスタンスComparableも渡していません。Comparator

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

クラスのを作成しComparatorて、メソッドにソート方法Personを指示する必要があります(Personクラスに格納されているStringにある可能性があります)sort()

ジェネリックコンパレータを実装する方法は次のとおりです。

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

そして、Collections.sort()メソッドの呼び出しは次のようになります。-

Collections.sort(nameFromText, new PersonNameComparator());
于 2012-10-07T18:28:31.617 に答える
4

または、ComparableインターフェイスをPersonクラスに直接実装し、'compareTo(Object obj)'メソッドをオーバーライドすることもできます。この場合、コンパレータ用の新しいクラスを作成する必要はありません。そして、これは組み込みの並べ替えのように動作します。

于 2012-10-07T18:45:45.003 に答える
2

これを試して:

List<String> inputString =  Arrays.asList("Sijan", "Sudeep", "Parasar", "Raj Kumar");
Collections.sort(inputString);
System.out.println(inputString);
于 2013-08-26T18:57:41.553 に答える
1

Java 8を使用している場合は、1つのライナーLambda式を使用します

ArrayList<Person> nameFromText = new ArrayList<Person>();
fillArrayList(nameFromText, pullFile);
nameFromText.sort((p1, p2) -> p1.getName().compareTo(p2.getName()));
于 2019-01-09T12:52:44.157 に答える
0

Collections.sort(managerNameList);を使用します。

ArrayList<String> managerNameList = new ArrayList<String>();

    managerNameList.add("antesh");
    managerNameList.add("Lalit");
    managerNameList.add("Gokul");
    managerNameList.add("Ajay");

    System.out.println("Arraylist before sorting");    
    for(String name: managerNameList)
    {    
        System.out.println(name);           
    }

    Collections.sort(managerNameList);

    System.out.println("Arraylist after sorting");    
    for(String name: managerNameList)
    {    
        System.out.println(name);           
    }
于 2013-11-21T06:22:49.560 に答える