无法尝试从.txt文件中对double进行排序

时间:2015-04-03 01:41:22

标签: java sorting

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

向正确的方向推进会很棒,谢谢。

1 个答案:

答案 0 :(得分:1)

问题是你没有正确阅读你的价值观!

你在这里阅读:

String line = input.nextLine();

然后尝试用第二个解析它,但是这个:

scan.hasNextDouble()

将始终返回false,因为每个字符串中的第一个标记是名称!而且它不是双倍的。您需要更改解析输入的方式。

此外,如果您要同时对名称和分数进行排序,则必须创建一个对象,该对象将封装namegrade并实现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}}