【问题标题】:java - sorting a hashmap with date inside value object [duplicate]java - 在值对象内对带有日期的哈希图进行排序[重复]
【发布时间】:2012-10-02 23:32:36
【问题描述】:

可能重复:
How to sort a Map<Key, Value> on the values in Java?

假设我有一张类似的地图

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

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

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

谁能帮忙..拜托..

【问题讨论】:

标签: java sorting hashmap date-sorting


【解决方案1】:

将可比对象添加到组

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

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

【讨论】:

    【解决方案2】:

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

    然后您可以创建自己的Comparator&lt;String&gt;,它将按实际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);
    

    【讨论】:

    • Comparator&lt;Student&gt; 无济于事:Student 是值,而不是键。
    • 不是真的!这取决于您的实施。
    • 您链接到TreeMap。如果您可以将其替换为指向按值排序的 Map 的链接,我很乐意删除我的 -1。
    • @DavidGrant 使用自定义比较器,您可以按值对TreeMap 进行排序。请参阅问题评论中的链接。
    • 这不会编译。对于TreeMap&lt;K,V&gt;,您必须提供Comparator&lt;K&gt;
    【解决方案3】:

    将学生对象添加到列表并使用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());
    

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2017-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-30
        • 1970-01-01
        相关资源
        最近更新 更多