3

可能重复:
如何对 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 上进行排序。

任何人都可以帮助..请..

4

4 回答 4

4

HashMap 未排序SortedMap,例如,您应该使用实现TreeMap

然后你可以创建你自己的Comparator<String>,它将按groups实际实例的属性排序,Student但你需要它的实际映射,因为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);
于 2012-10-12T07:28:44.190 回答
3

如何使用这种情况在我的 HashMap studDetails 上进行排序?

你不能,因为HashMap它基本上是无序的(或者至少,排序是不稳定且无用的)。

即使对于排序的地图TreeMap,排序顺序是基于,而不是

于 2012-10-12T07:28:21.753 回答
0

将学生对象添加到列表并使用Collections.sort(list, custom_comparetor).

准备一个自定义比较器来对学生对象进行排序。

试试这个代码它可能会有所帮助

StudentComparator.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());
    }

}

GroupComparator.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());
于 2012-10-12T07:30:34.837 回答
0

将可比较添加到组

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());
    }
}

在学生组中使用 TreeSet 而不是 List

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();

然后添加学生。它将被订购一个。希望你能处理空指针异常

于 2012-10-12T07:53:20.523 回答