尝试从.txt文件中排序双重时遇到问题
试图从我的.txt文件中降序排列双打并打印结果,但为什么我得到4行[]?尝试从.txt文件中排序双重时遇到问题
我的文本文件看起来像这样:
Mary Me,100.0
Hugh More,50.8
Jay Zee,85.0
Adam Cop,94.5
\t public static void sortGrade() throws IOException
\t {
\t Scanner input = new Scanner(new File("Grades.txt"));
\t while(input.hasNextLine())
\t {
\t \t String line = input.nextLine();
\t ArrayList<Double> grades = new ArrayList<Double>();
\t Scanner scan = new Scanner(line);
\t scan.useDelimiter(",");
\t while(scan.hasNextDouble())
\t {
\t \t grades.add(scan.nextDouble());
\t }
\t scan.close();
\t Collections.sort (grades,Collections.reverseOrder());
\t System.out.println(grades);
\t }
\t input.close();
\t }
我想为输出看起来像这样:
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
作为每个名称,对成绩进行排序,然后按顺序打印以获取每个成绩的名称(同一成绩可能有多个名称)。这不被推荐,因为它看起来笨拙。
编写类似类真的不是那么难,你只需要实现一个方法:-)
@Edit:你并不需要第二个扫描仪,如果您的格式设置和易于只使用一个split
上line
这样的:
String[] gradeName = line.split(",");
grades.add(Double.parseDouble(gradeName[1]));
如果你能有每人超过1级比,而不是刚开gradeName[1]
叠代gradeName
索引1
从元素开始(因为0
是这个名字)。
@ EDIT2:
您正在创建每次新grades
列表中循环,所以它会读取一个条目,将其添加到列表,排序并打印。你应该拔出一切,除了while循环之外的线路:
String line = input.nextLine();
String[] gradeName = line.split(",");
grades.add(Double.parseDouble(gradeName[1]));
@ EDIT3:
如果你想要一个升序不使用Collections.reverseOrder()
,只是默认一个:
Collections.sort (grades);
我应该使用'scan.next()'可以行然后'Double.parseDouble(线);'来解析行的双? – lamps 2015-04-03 01:54:42
@lamps看我的编辑 – 2015-04-03 01:57:29
创建一个包含'name'和'grade'两个字段的类。让你的班级实施“可比较”,根据等级进行排序。当你读取文件中的每一行时,创建你的类的一个实例并将其添加到一个ArrayList中。然后调用Collections.sort()对列表进行排序。 – dnault 2015-04-03 01:44:20
@dnault是唯一的选择吗?我不熟悉如何使用Comparable。 – lamps 2015-04-03 01:45:59
不,它不是唯一的选择。你的老师告诉过你什么其他工具?为什么不成为你自己的教师,并阅读Javadoc for Comparable:http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html – dnault 2015-04-03 01:47:57