Сортировка объектов по полю в ArrayList

380
27 декабря 2017, 20:45

У меня есть коллекция объектов, которая внутри себя содержит также коллекцию объектов, которые требуется отсортировать в алфавитном порядке по имени поля name. Каким способом лучше это всего сделать, через стримы я смог отсортировать только внешние объекты, но как подобраться к внутренним не понятно.

Прикладываю скрин структуры объектов. Соответственно, нужна сортировка только коллекции members. Подскажите, каким способом это лучше всего сделать?

UPDATE:

public class SmbpStructUserType extends SmbpUserType {
    @XmlElement(name = "Members")
    MembersList membersList = new MembersList();
    public boolean addMember(Member member) {
        return membersList.members.add(member);
    }
    public List<Member> getMembers() {
        return Collections.unmodifiableList(membersList.members);
    }
    static class MembersList {
        @XmlElement(name = "Member")
        List<Member> members = new ArrayList<>();
    }
    public static class Member {
        private String name;

        private long userTypeId;
        public String getName() {
            return name;
        }
        @XmlAttribute(name = "Name", required = true)
        public void setName(String name) {
            this.name = name;
        }
        public long getUserTypeId() {
            return userTypeId;
        }
        @XmlAttribute(name = "UserTypeId", required = true)
        public void setUserTypeId(long userTypeId) {
            this.userTypeId = userTypeId;
        }
    }
}

Добавление элементов:

Map<Integer, SmbpStructUserType> structUserTypeMap = new HashMap<>();
        jdbcTemplate.query(queryForGetStructUserTypes, resultSet -> {
            SmbpStructUserType smbpStructUserType = structUserTypeMap.computeIfAbsent(userTypeId, p -> {
                SmbpStructUserType userType = new SmbpStructUserType();
                userType.setId(userTypeId);
                userType.setName(typeName);
                userType.setNamespace(namespace);
                userType.setDescription(description);
                return userType;
            });
            SmbpStructUserType.Member member = new SmbpStructUserType.Member();
            member.setName(resultSet.getString("MemberName"));
            member.setUserTypeId(resultSet.getLong("MemberUserTypeId"));
            smbpStructUserType.addMember(member);
        }, UserTypeKind.STRUCT.getId());
Answer 1

HashMap? Которая внутри содержит коллекцию? У вас формулировка идет вразрез с тем, что на скриншотике и в коде.

Обновил ответ

Для того, чтобы отсортировать (по полю name) объекты Member внутри коллекций members, которые в свою очередь находятся в объектах MembersList которые находятся в объектах SmbpStructUserType, вам нужно сделать вот так:

structUserTypeMap.forEach((k, v) -> {
    v.membersList.members.sort(Comparator.comparing(m -> m.name));        
});

Что делаю:

Проходим-пробегаем по мапе structUserTypeMap, из каждого ее value берем membersList.members - ArrayList. На этой коллекции вызываем метод sort, передавая компаратор, который будет сравнивать объекты Member по их полю name. Коллекция отсортирована в том месте, где и была. И все довольны!

Если брать values:

values = structUserTypeMap.values();
values.forEach(v -> {
    v.membersList.members.sort(Comparator.comparing(m -> m.name));        
});

В способе с потоками (stream) создаются временные наборы элементов, а исходные остаются нетронутыми, поэтому тут потоки я не использовал.

Однако с точки зрения читаемости кода, да и в целом как хороший тон, вам стоило бы инкапсулировать вашу сортировку внутри, скажем, вашего SmbpStructUserType:

public void sortMembers() {
    // логика сортировки тут
}

Чтобы потом можно было просто и понятно сортировать всю карту:

structUserTypeMap.forEach((k, v) -> v.sortMembers());

А для values еще приятнее:

values.forEach(SmbpStructUserType::sortMembers);
READ ALSO
Выделение текста курсивом в JTextPane

Выделение текста курсивом в JTextPane

Я создал JTextPane и кнопку которая будет делать текст «курсивом»Осуществил изменения шрифта так:

234
Device Owner не работает в Android TV Box

Device Owner не работает в Android TV Box

Я хочу установить мое приложение в качестве владельца устройства на Android TV Box, и я получаю следующее исключение

276
Создание 3-х динамических макетов с Custom ViewAdapter

Создание 3-х динамических макетов с Custom ViewAdapter

Доброго времени суток! Делаю вёрстку динамического каталога с помощью адаптеровПриложение будет отлавливать JSON с данными и впихивать их в 3 фрагмента

177