2015-04-03 71 views
0

试图从我的.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

在正确的方向一推将是巨大的,谢谢。

+2

创建一个包含'name'和'grade'两个字段的类。让你的班级实施“可比较”,根据等级进行排序。当你读取文件中的每一行时,创建你的类的一个实例并将其添加到一个ArrayList中。然后调用Collections.sort()对列表进行排序。 – dnault 2015-04-03 01:44:20

+0

@dnault是唯一的选择吗?我不熟悉如何使用Comparable。 – lamps 2015-04-03 01:45:59

+0

不,它不是唯一的选择。你的老师告诉过你什么其他工具?为什么不成为你自己的教师,并阅读Javadoc for Comparable:http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html – dnault 2015-04-03 01:47:57

回答

1

问题是你没有正确读取你的值!

你在你行读这里:

String line = input.nextLine(); 

然后试图用第二个来分析,但这样的:

scan.hasNextDouble() 

总是返回false在每个第一令牌字符串是名字!这不是双重的。你需要改变你解析输入的方式。

此外,如果要排序的名称,而且你必须创建一个对象,会同时封装namegrade和实施Comparable或写这种类型的自定义Comparator同时得分。否则,您必须为Map映射grade作为每个名称,对成绩进行排序,然后按顺序打印以获取每个成绩的名称(同一成绩可能有多个名称)。这不被推荐,因为它看起来笨拙。

编写类似类真的不是那么难,你只需要实现一个方法:-)

@Edit:你并不需要第二个扫描仪,如果您的格式设置和易于只使用一个splitline这样的:

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); 
+0

我应该使用'scan.next()'可以行然后'Double.parseDouble(线);'来解析行的双? – lamps 2015-04-03 01:54:42

+0

@lamps看我的编辑 – 2015-04-03 01:57:29