我需要编写一个Java程序,在那里我可以从具有学生姓名和成绩的文件中读取数据。我必须找到每个学生的最高分,然后在新文件中写下他的名字和最高分。我能够做到这一点。问题是,学生应该根据他们的最高成绩按递减顺序打印,我无法知道如何做到这一点。你能帮我吗?谢谢!
public class NotaMax {
public static void main(String args[]) throws FileNotFoundException{
Scanner input=new Scanner(new File("teksti.txt"));
PrintStream output=new PrintStream(new File("max.txt"));
while(input.hasNextLine()) {
String rreshti=input.nextLine();
max(rreshti,output);
}
}
public static void max(String text,PrintStream output) {
Scanner data=new Scanner(text);
String emri=data.next();
double max=0;
while(data.hasNext()) {
double nota=data.nextDouble();
if(nota>max) {
max=nota;
}
}
output.println(""+emri+":"+max);
}
}
答案 0 :(得分:1)
这有两种方法,一种填补另一种方法。
您可以将它们保存在Array#reverse
中,然后调用方法ArrayList
,以便反转Object
。要添加另一层确定性,最好将Class
/ Student
命名为Comparator
并将#sort
应用于ArrayList
方法Student Object
以确保结果。
然而,这比处理这个问题的最简单,最有效的方法需要更多的步骤。
您可以做的最好的事情是将ArrayList
保存在HashSet
(或Comparable Collection/Map
,实际上是#sort
)内,并使用:hashtag
方法从下到上排序。
我可以(如果要求)为此提供一些代码。
答案 1 :(得分:1)
我想到的第一件事是为您的学生创建一个单独的类,并将一个简单的二进制堆实现为最大堆,每个学生的最高成绩作为排序标准。然后打印它。不应该努力。
答案 2 :(得分:0)
这应该可以解决您的问题。首先在地图中阅读teksti.txt
中的学生和成绩,然后找到每个学生的最高成绩。
public class NotaMax {
private static Map<String, ArrayList<Integer>> students = new HashMap<>();
private static void readTeksti() throws FileNotFoundException {
Scanner input = new Scanner(new File("teksti.txt"));
// read teksti.txt
String[] line;
while (input.hasNextLine()) {
String rreshti = input.nextLine();
line = rreshti.split(" ");
ArrayList<Integer> grades = students.get(line[0]);
if (grades == null) {
grades = new ArrayList<>();
grades.add(Integer.parseInt(line[1]));
students.put(line[0], grades);
} else {
grades.add(Integer.parseInt(line[1]));
}
}
}
public static void main(String args[]) throws FileNotFoundException {
readTeksti();
max();
}
private static void max() throws FileNotFoundException {
PrintStream output = new PrintStream(new File("max.txt"));
List<Map.Entry<String,Integer>> maximums = new LinkedList<>();
for (String current : students.keySet()) {
ArrayList<Integer> grades = students.get(current);
Integer max = Collections.max(grades);
maximums.add(new AbstractMap.SimpleEntry<>(current, max));
}
Collections.reverse(maximums);
for (Map.Entry<String,Integer> current : maximums) {
output.println("" + current.getKey() + ":" + current.getValue());
}
}
}
我认为teksti.txt
就像:
saman 100
samad 80
samsam 70
samsam 90
saman 90