可能的重复项:
如何在 Java 中的值上对 Map<Key、Value> 进行排序?
假设我有一张地图,
比如Map<String, Student> studDetails = new HashMap<String, Student>();
地图包含以下条目
studDetails.put("1",student1);
studDetails.put("2",student2);
studDetails.put("3",student3);
studDetails.put("4",student4);
学生实体是类似
Class Student{
private String studName;
private List<Group> groups;
}
组实体将像
Class Group{
private String groupName;
private Date creationDate;
}
好的,所以我需要的是当我显示学生详细信息时,它将按照组创建日期的顺序排列。因此,如果学生映射到多个组,我们可以获取第一组的创建日期。
如何使用这种情况在我的哈希图studDetails
上给出酸痛。?
谁能帮忙..请。。
HashMap 未排序,您应该使用 SortedMap
实现,例如 TreeMap
。
然后,您可以创建自己的Comparator<String>
,该将按实际Student
实例的groups
属性进行排序,但您需要实际映射,因为TreeMap
按键排序,因此这是一个可能但不好的解决方案。
所以有了TreeMap
:
public class StudentGroupComparator implements Comparator<String> {
private Map<String, Student> sourceMap;
public StudentGroupComparator(Map<String, Student> sourceMap) {
this.sourceMap = sourceMap;
}
@Override
public int compare(String key1, String key2) {
// TODO: null checks
Student student1 = sourceMap.get(key1);
Student student2 = sourceMap.get(key2);
Date o1CreationDate = student1.groups.get().creationDate;
Date o2CreationDate = student2.groups.get().creationDate;
return o1CreationDate.compareTo(o2.creationDate);
}
}
SortedMap<String, Student> sortedMap = new TreeMap<String, Student>(new StudentGroupComparator(sourceMap));
sortedMap.putAll(sourceMap);
如何使用此场景在我的哈希图螺柱上给出酸痛的详细信息?
你不能,因为HashMap
从根本上来说是无序的(或者至少,排序是不稳定的和无益的)。
即使对于像TreeMap
这样的排序映射,排序顺序也是基于键,而不是值。
将学生对象添加到列表并使用Collections.sort(list, custom_comparetor).
准备一个自定义比较器对学生对象进行排序。
试试这段代码可能会有所帮助
学生比较器.java
class StudentComparator implements Comparator {
public int compare(Object stud1, Object stud2) {
List<Group> list1Grp = ((Student) stud1).getGroups();
List<Group> list2Grp = ((Student) stud2).getGroups();
Collections.sort(list1Grp, new GroupComparator());
Collections.sort(list2Grp, new GroupComparator());
return list1Grp.get(0).getCreationDate().compareTo(list2Grp.get(0).getCreationDate());
}
}
组比较器.java
public class GroupComparator implements Comparator {
public int compare(Object grp1, Object grp2) {
return ((Group) grp1).getCreationDate().compareTo(
((Group) grp2).getCreationDate());
}
}
主要方法
将学生对象添加到一个新列表
然后使用
Collections.sort(new_stud_list, new StudentComparator());
添加与组相当
class Group implements Comparable {
private String groupName;
private Date creationDate;
public Date getCreationDate() {
return creationDate;
}
@Override
public int compareTo(Object t) {
Group g = (Group) t;
return getCreationDate().compareTo(g.getCreationDate());
}
}
在学生中对小组使用树集而不是列表
public class Student implements Comparable {
private String studName;
private TreeSet<Group> groups;
public TreeSet<Group> getGroups() {
return groups;
}
@Override
public int compareTo(Object t) {
Student t1 = (Student) t;
return groups.first().getCreationDate()
.compareTo(t1.getGroups().first().getCreationDate());
}
}
现在使用
TreeSet<Student> studDetails = new TreeSet();
然后添加学生。它将被订购一个。希望你能处理空指针异常