gpt4 book ai didi

java - 使用compareTo()从文件读取、标记化、排序不起作用?

转载 作者:行者123 更新时间:2023-12-02 05:45:46 25 4
gpt4 key购买 nike

我正在从文本文件中读取数据,使用 split() 进行标记,使用它来填充学生对象,将其保存在列表中并对其进行排序。(如果名称相同,则按年龄排序。如果年龄也相同,按照 rollno 排序)。

public class MyClass {
public static void main(String[] args)
{try{
Scanner scr=new Scanner(new File("studentdetails"));
String str1=scr.nextLine();

String[] tokens1=str1.split(",");
Student s1 = new Student(Integer.parseInt(tokens1[0]), tokens1[1], Integer.parseInt(tokens1[2]));

String str2=scr.nextLine();
String[] tokens2=str2.split(",");
Student s2 = new Student(Integer.parseInt(tokens2[0]), tokens2[1], Integer.parseInt(tokens2[2]));

String str3=scr.nextLine();
String[] tokens3=str3.split(",");
Student s3 = new Student(Integer.parseInt(tokens3[0]), tokens3[1], Integer.parseInt(tokens3[2]));

List<Student> list=new ArrayList<Student>();
list.add(s1); list.add(s2); list.add(s3);
Collections.sort(list);
System.out.println(list);
}
catch(Exception e){e.printStackTrace();}
}
}

这是我的 Student 类,它实现了类似的接口(interface)。

public class Student implements Comparable<Student> {
private int rollno;
private String name;
private int age;
Student(int r, String n, int a){ rollno=r; name=n; age=a;}

public String toString()
{return rollno+" "+name+" "+age;}

public int compareTo(Student s) {
if(name != s.name) return (name).compareTo(s.name);
if(age != s.age) return new Integer(age).compareTo(s.age);
return new Integer(rollno).compareTo(s.rollno);
}
}

studentdetails内容如下:(第一列是rollno,第三列是age)

33,Zack,44
5,Anna,5
4,Zack,4

现在有趣的是,我的数据按照名称排序,但如果名称相同,它不会按照年龄、卷号等排序。

如果我手动填充列表,compareTo() 就会起作用。然而,从文件读取、标记化和排序会出错。

花了一整天的时间调试。各位JAVA高手,能帮帮我吗?

最佳答案

您使用名称的标识( ==!= )而不是值( equals() )来决定名称是否“相等”。

names.name从文件读取时,它们不是同一个对象,即使它们具有相同的值。您的比较器应该检查它们的值。您之前没有注意到这一点,因为编译器会在您的源代码中保留文字字符串,因此如果您在源代码中两次写入相同的字符串,它将是同一个对象,并且 ==!=看起来会起作用。

你的比较器应该看起来更像这样:

// first compare by name. If different, return that immediately.
final int nameDiff = name.compareTo(s.name);
if (nameDiff != 0) return nameDiff;

// name is the same. Now compare age and return if different.
final int ageDiff = age - s.age;
if (ageDiff != 0) return ageDiff;

// final layer of sorting: rollno
return rollno - s.rollno;

关于java - 使用compareTo()从文件读取、标记化、排序不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24086925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com