Сортировка хеш-карты с датой внутри объекта значения

Возможный дубликат:
Как отсортировать карту по значениям в 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();

затем добавьте студентов. Будет заказан один. Надеюсь, вы можете позаботиться об исключениях нулевого указателя

Другие вопросы по тегам