[英]Sorting collections using a Map with string and separate class
我基本上是試圖按字母和數字順序對學生和標記的輸入文件進行排序。 我有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;
}
}
HashMap
是無序集合,因此它沒有定義其鍵的排序。 這就是為什么您以隨機順序獲得輸出的原因。
您可以嘗試使用有序的集合類型,例如List
( ArrayList
或LinkedList
),或者如果您確實需要Map
那么可以查看TreeMap
類。 TreeMap
是一個Map
實現,它知道如何對其鍵進行排序。 請注意, TreeMap
無法按值排序,因此它可能不是在此處使用的正確數據結構,因為您將無法(輕松地)將其用於按標記排序。
我不會給您代碼,因為這顯然是家庭作業,但是希望可以使您走上正確的道路。
編輯:解決以下評論: 排序與sorted不同 。 要將List
實際排序為所需的順序,請查看Collections.sort
方法。
永遠不要使用“ ==”來比較字符串,始終使用“等於”來進行比較。 在行中
return (name == m.name) && (mark == m.mark);
更改為
return (name.equals(m.name))&& (mark == m.mark);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.