我基本上尝试将学生和标记的输入文件排序为字母和数字顺序。我有4个班级,但是我无法让它以任何顺序打印带有标记的学生。更别提按字母和数字顺序了。任何帮助我如何获得结果打印作为一个总或任何帮助非常感谢。 下面是我用于4个类和输入文件的代码。
输入文件:
Simon 4
Anna 10
Simon 4
Anna 9
Anna 5
Edward 10
代码:
package part1;
import java.io.FileReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
Map<String, StudentMath> map = new HashMap<String, StudentMath>();
String input = "data/results.txt";
Scanner scan = new Scanner(new FileReader(input));
while (scan.hasNextLine()) {
String line = scan.nextLine();
String[] in = line.split(" ");
String name = in[0];
int mark = Integer.parseInt(in[1]);
//System.out.println(name + ":" + mark);
StudentMath stud = map.get(name);
if (stud == null) {
stud = new StudentMath(name, mark);
map.put(name, stud);
stud.sum(mark);
}
}
for (String s: map.keySet()){
System.out.println(s);
}
}
}
package part1;
public class StudentMath extends Main {
public String name;
public int mark;
public StudentMath(String s, int n) {
name = s;
mark = n;
}
public String getName() {
return name;
}
public int getMark() {
return mark;
}
public int sum() {
int tot = mark + mark;
return tot;
}
public boolean equals(Object o) {
if (o instanceof StudentMath) {
StudentMath m = (StudentMath) o;
return (name == m.name) && (mark == m.mark);
}
else {
return false;
}
}
}
package part1;
import java.util.Comparator;
public class NameCompare implements Comparator<StudentMath> {
public int compare(StudentMath g1, StudentMath g2) {
return g1.name.compareTo(g2.name);
}
}
package part1;
import java.util.Comparator;
public class MarkCompare implements Comparator<StudentMath>{
public int compare(StudentMath g1, StudentMath g2) {
return g2.mark - g1.mark;
}
}
答案 0 :(得分:2)
HashMap
是无序集合,因此它没有定义对其键的排序。这就是你以随机顺序获得输出的原因。
您可以尝试使用有序的集合类型,例如List
(ArrayList
或LinkedList
),或者如果您确实需要Map
,那么您可以看看TreeMap
课程。 TreeMap
是一个Map
实现,它知道如何对其键进行排序。请注意TreeMap
无法按值排序,因此可能不适合在此处使用,因为您无法(轻松)使用它来按标记排序。
我不会给你代码,因为这显然是家庭作业,但希望这会让你走上正确的轨道。
编辑:要解决以下评论:已订购与已排序不同。要将List
实际排序为您想要的顺序,请查看Collections.sort
方法。
答案 1 :(得分:1)
永远不要使用“==”比较字符串总是使用“等于”进行比较。 在行
return (name == m.name) && (mark == m.mark);
将其更改为
return (name.equals(m.name))&& (mark == m.mark);