试图从.txt文件中按降序对doubles进行排序并打印出结果,但为什么我得到了4行[]?
我的文本文件如下:
Mary Me,100.0
Hugh More,50.8
Jay Zee,85.0
Adam Cop,94.5
我的代码看起来像这样:
public static void sortGrade() throws IOException
{
Scanner input = new Scanner(new File("Grades.txt"));
while(input.hasNextLine())
{
String line = input.nextLine();
ArrayList<Double> grades = new ArrayList<Double>();
Scanner scan = new Scanner(line);
scan.useDelimiter(",");
while(scan.hasNextDouble())
{
grades.add(scan.nextDouble());
}
scan.close();
Collections.sort (grades,Collections.reverseOrder());
System.out.println(grades);
}
input.close();
}
我希望输出看起来像这样:
Hugh More,50.8
Jay Zee,85.0
Adam Cop,94.5
Mary Me,100.0
如果能朝着正确的方向前进,那就太好了,谢谢。
问题是您没有正确读取值!
你在这里读到的是:
String line = input.nextLine();
然后尝试用第二个来解析它,但这个是:
scan.hasNextDouble()
将始终返回false
,因为每个字符串中的第一个令牌就是名称!而且它不是替身。您需要更改解析输入的方式。
此外,如果您想同时对名称和分数进行排序,则必须创建一个对象来封装name
和grade
并实现Comparable
,或者为该类型编写一个自定义Comparator
。否则,您必须制作一个Map
,将grade
映射到每个名称,对成绩进行排序,然后按顺序打印,同时获取每个成绩的名称(同一成绩可以有多个名称)。不建议这样做,因为它看起来确实很笨拙。
编写一个类似的类真的没有那么难——你只需要实现一个方法:-)
@编辑:如果你的格式设置好了,那么你不需要第二个扫描仪,只需在line
上使用split
,如下所示:
String[] gradeName = line.split(",");
grades.add(Double.parseDouble(gradeName[1]));
如果每个人可以获得1个以上的分数,而不是仅仅获得gradeName[1]
,则从索引1
的元素开始迭代gradeName
(因为0
是名称)。
@第2版:
你每次都在循环中创建一个新的grades
列表,所以它会读取一个条目,将其添加到列表中,排序并打印
String line = input.nextLine();
String[] gradeName = line.split(",");
grades.add(Double.parseDouble(gradeName[1]));
@第3版:
如果你想要升序,不要使用Collections.reverseOrder()
,只使用默认的:
Collections.sort (grades);