尝试从.txt文件中对double进行排序时遇到问题



试图从.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,因为每个字符串中的第一个令牌就是名称!而且它不是替身。您需要更改解析输入的方式。

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

最新更新