Сортировка хеш-карты с датой внутри объекта значения
Возможный дубликат:
Как отсортировать картупо значениям в 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
используя этот сценарий.
Может кто-нибудь помочь.. пожалуйста..
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);
Как я могу дать оценку на моих HashMap studDetails, используя этот сценарий?
Вы не можете, потому что HashMap
принципиально неупорядочен (или, по крайней мере, порядок нестабилен и бесполезен).
Даже для отсортированных карт, таких как TreeMap
порядок сортировки основан на ключе, а не на значении.
Добавить объекты студентов в список и использовать 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());
Добавить сопоставимый в группу
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 в Student для групп
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();
затем добавьте студентов. Будет заказан один. Надеюсь, вы можете позаботиться об исключениях нулевого указателя