问题
I got everything else to work except the sort method. I need to sort the Students in the HashMap based on the Student's first attribute. I need the sort method to happen after I added all of the students in the HashMap, not while it's being added.
package HashMap;
import java.io.InputStream;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Scanner;
public class clubMapping {
HashMap<String, HashSet<Student>> map = new HashMap<String, HashSet<Student>>();
public clubMapping(String clubName) {
InputStream is = getClass().getClassLoader().getResourceAsStream(
"student.txt");
Scanner scan = new Scanner(is);
while (scan.hasNext())
add(scan.next(), scan.next(), Integer.parseInt(scan.next()),
scan.next());
scan.close();
System.out.println(map);
System.out.println();
System.out.println(map.get(clubName));
}
public void add(String last, String first, Integer id, String club) {
HashSet<Student> set = new HashSet<Student>();
if (!map.containsKey(club)) {
set.add(new Student(last, first, id));
map.put(club, set);
} else {
set = map.get(club);
set.add(new Student(last, first, id));
}
}
public static void main(String[] args) {
new clubMapping("Math");
}
}
package HashMap;
public class Student {
String last, first;
Integer id;
public Student(String l, String f, Integer i) {
last = l;
first = f;
id = i;
}
public String toString() {
return last + " " + first + " " + id;
}
}
回答1:
You should use a TreeSet instead of a HashSet for the student set. A tree set is implicitly sorted, a hash set is not.
public void add(String last, String first, Integer id, String club) {
TreeSet<Student> set = new TreeSet<Student>(studentComp);
if (!map.containsKey(club)) {
set.add(new Student(last, first, id));
map.put(club, set);
} else {
set = map.get(club);
set.add(new Student(last, first, id));
}
}
But you must define a comparator to use for the sorting, as shown below.
private static Comparator<Student> studentComp = new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
return (s1.last.compareTo(s2.last));
}
};
Also, you should probably encapsulate your student attributes in getter/setter methods, rather than accessing them directly as I've done above (as your class currently allows).
来源:https://stackoverflow.com/questions/13773662/how-to-sort-object-based-on-objects-attribute