尝试从我的.txt文件中按降序对双打进行排序并打印出结果,但为什么我得到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
向正确的方向推进会很棒,谢谢。
答案 0 :(得分:1)
问题是你没有正确阅读你的价值观!
你在这里阅读:
String line = input.nextLine();
然后尝试用第二个解析它,但是这个:
scan.hasNextDouble()
将始终返回false
,因为每个字符串中的第一个标记是名称!而且它不是双倍的。您需要更改解析输入的方式。
此外,如果您要同时对名称和分数进行排序,则必须创建一个对象,该对象将封装name
和grade
并实现Comparable
或编写该类型的自定义Comparator
。否则,您必须为每个名称制作Map
映射grade
,对等级进行排序,然后按顺序打印,同时获取每个等级的名称(同一等级可以有多个名称) )。不推荐这样做,因为它确实看起来很笨拙。
编写一个类似的课程并不是很难实现一个方法: - )
@Edit:您不需要第二台扫描仪,如果您的格式已设置且只需使用split
上的line
就可以了:
String[] gradeName = line.split(",");
grades.add(Double.parseDouble(gradeName[1]));
如果每个人的成绩可以超过1个而不是仅从gradeName[1]
开始gradeName
从索引1
的元素开始迭代0
,因为grades
是名称)。
@ EDIT2:
您每次都在循环中创建一个新的String line = input.nextLine();
String[] gradeName = line.split(",");
grades.add(Double.parseDouble(gradeName[1]));
列表,因此它将读取一个条目,将其添加到列表中,对其进行排序并打印。除了while循环之外的那些行,你应该拔出所有东西:
Collections.reverseOrder()
@ EDIT3:
如果您想要升序,请不要使用Collections.sort (grades);
,只需使用默认订单:
{{1}}