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集合排序Person的ArrayList_Java_Sorting_Collections_Io - Fatal编程技术网

使用java集合排序Person的ArrayList

使用java集合排序Person的ArrayList,java,sorting,collections,io,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");

下面是我正在使用的代码,除了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();
}
publicstaticvoidmain(字符串[]args)引发IOException{
//创建并填充文本文件
Writer textFile=new FileWriter(“names.txt”);
字符串[]名称数组=新字符串[]{“Tina Tully\n”、“Bill Simpson\n”,
“Dana Smith\n”、“Ralph Andrews\n”、“Greg Smithers\n”,
“Lisa Krump\n”、“Gill Biters\n”、“Barbara West\n”,
“桑德拉·麦克唐纳”、“巴特·威利斯”、“巴基·齐默尔曼”,
“Richard Vicks\n”、“Velma Tarp\n”、“Winslow Tunnell\n”,
“安德鲁·莱特曼”、“贝蒂·特朗普”、“沃尔多·史密斯”,
“Kyle Ronno\n”、“Vivian West\n”、“Wendy Tunnell\n”};
generateText(文本文件,名称数组);
//创建以前创建的文本文件的对象
Scanner pullFile=new Scanner(新文件(“names.txt”);
//创建20个Person对象并使用添加到ArrayList数据结构
//为文本文件中的值指定的名称变量
ArrayList name fromtext=新的ArrayList();
fillArrayList(nameFromText,pullFile);
//排序数组列表
Collections.sort(nameFromText);
//打印阵列列表
printNamesFromObjects(nameFromText);
}
私有静态void printNamesFromObjects(ArrayList namesFromText){
对于(int i=0;i<20;i++){
System.out.println(namesFromText.get(i).name);
}
}
私有静态void fillArrayList(ArrayList名称FromText,
扫描仪(文件){
while(pullFile.hasNext()){
Person obj=新的Person(pullFile.nextLine());
nameFromText.add(obj);
}
}
私有静态void generateText(编写器文本文件,字符串[]nameArray)
抛出IOException{
对于(int i=0;i<20;i++){
write(新字符串(nameArray[i]);
}
textFile.close();
}
方法期望它所排序的列表元素具有可比性。要么元素类型
T
应该实现接口,要么您应该使用重载方法,该方法采用泛型实例

在下面的代码中,您不满足上述两个条件。您的
Person
类既没有实现
Comparable
,也没有传递任何
比较程序
实例

ArrayList<Person> nameFromText = new ArrayList<Person>();
fillArrayList(nameFromText, pullFile);
// Sort ArrayList
Collections.sort(nameFromText);  // How to sort?
然后您的
Collections.sort()
方法调用应该如下所示:-

Collections.sort(nameFromText, new PersonNameComparator());

或者,您可以直接在Person类中实现Comparable接口,并重写“compareTo(Object obj)”方法。在这种情况下,您不需要为comparator创建新类。这与内置排序类似。

尝试以下操作:

List<String> inputString =  Arrays.asList("Sijan", "Sudeep", "Parasar", "Raj Kumar");
Collections.sort(inputString);
System.out.println(inputString);
List inputString=Arrays.asList(“Sijan”、“Sudeep”、“Parasar”、“Raj Kumar”);
Collections.sort(inputString);
System.out.println(inputString);

使用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);           
    }
arraylistmanagernamelist=newarraylist();
managerNameList.add(“antesh”);
managerNameList.add(“Lalit”);
managerNameList.add(“Gokul”);
managerNameList.add(“Ajay”);
System.out.println(“排序前的Arraylist”);
for(字符串名称:managerNameList)
{    
System.out.println(名称);
}
Collections.sort(managerNameList);
System.out.println(“排序后的Arraylist”);
for(字符串名称:managerNameList)
{    
System.out.println(名称);
}

如果使用Java 8,则使用一个线性表达式Lambda表达式

ArrayList<Person> nameFromText = new ArrayList<Person>();
fillArrayList(nameFromText, pullFile);
nameFromText.sort((p1, p2) -> p1.getName().compareTo(p2.getName()));
ArrayList nameFromText=new ArrayList();
fillArrayList(nameFromText,pullFile);
nameFromText.sort((p1,p2)->p1.getName().compareTo(p2.getName());

@DavidTunnell不客气。。你也可以用谷歌搜索“Comparator和Comparable之间的差异”来获取更多信息。
Comparable
也用于此目的。
Comparator
更广泛,因为你可以创建多个排序逻辑。。我想你的代码有一个拼写错误。应该是:
…(Person)o
1
;…Person p2=(Person)o
2
?+1这是一个有效点。但是你应该更喜欢
Comparator
而不是
Comparable
。这样你可以为你的类拥有多个排序逻辑。是的,当有多个排序候选者时,Comparator为你提供了灵活性。你会发现这很有用。并且
ArrayList<Person> nameFromText = new ArrayList<Person>();
fillArrayList(nameFromText, pullFile);
nameFromText.sort((p1, p2) -> p1.getName().compareTo(p2.getName()));