关于Java:在值对象中用日期排序哈希图

java - sorting a hashmap with date inside value object

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How to sort a Map on the values in Java?

假设我有一张地图

1
Map<String, Student> studDetails = new HashMap<String, Student>();

地图上有这样的条目

1
2
3
4
studDetails.put("1",student1);
studDetails.put("2",student2);
studDetails.put("3",student3);
studDetails.put("4",student4);

学生实体就像

1
2
3
4
Class Student{
           private String studName;
           private List<Group> groups;
}

集团实体将

1
2
3
4
Class Group{
             private String groupName;
             private Date creationDate;
}

好的,所以我需要的是当显示学生的详细信息时,它将按组创建日期的顺序排列。因此,如果学生被映射到多个组,我们可以取第一个组的创建日期。

我怎么能用这个场景在我的hashmap studDetails上进行SORING呢?

有人能帮忙吗……请……


hashmap没有排序,您应该使用SortedMap实现,而不是例如TreeMap

然后您可以创建自己的Comparator,它将按实际Student实例的groups属性排序,但您需要实际的映射,因为TreeMap按键排序,所以这是一个可能但不好的解决方案。

所以对于TreeMap来说:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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);


How can I given the soring on my HashMap studDetails using this scenario?

你不能这样做,因为HashMap根本上是无序的(或者至少,这种排序是不稳定的和无用的)。

即使对于像TreeMap这样的排序映射,排序顺序也基于键,而不是值。


添加可比组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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());
    }

}

现在使用

1
TreeSet<Student> studDetails = new TreeSet();

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


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

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

尝试此代码可能会有所帮助

studentcomparator.java语言

1
2
3
4
5
6
7
8
9
10
11
12
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

1
2
3
4
5
6
7
8
public class GroupComparator implements Comparator {

    public int compare(Object grp1, Object grp2) {
        return ((Group) grp1).getCreationDate().compareTo(
                ((Group) grp2).getCreationDate());
    }

}

主要方法

将学生对象添加到一个新列表

然后使用

1
Collections.sort(new_stud_list, new StudentComparator());