Добавление объекта в ArrayList из ArrayLists - PullRequest
0 голосов
/ 19 мая 2019

У меня есть ArrayList из ArrayLists, которые содержат объекты MusicTrack.Я хочу иметь список массивов для каждой буквы алфавита, а затем в них содержатся все дорожки, которые начинаются с этой буквы.У меня возникают проблемы с добавлением объектов MusicTrack к этим внутренним спискам ArrayLists.

Например: title [0] содержит все дорожки, которые начинаются с A, и т. Д. Через заголовки [26], содержащие Z-дорожки.У объекта MusicTrack есть метод getter, называемый getTitle (), который возвращает строку заголовка для сравнения.

import java.util.ArrayList;

public class TitleBucket implements BucketInterface{
    private ArrayList<ArrayList<MusicTrack>> titles;

    public TitleBucket(){
        this.titles = new ArrayList<ArrayList<MusicTrack>>(26);
        for (int i=0; i<26; i++){
            titles.add(new ArrayList<MusicTrack>());
        }
    }

    public void addItem(MusicTrack itemToAdd){
        int comp = Character.toUpperCase(itemToAdd.getTitle().charAt(0)) - 'A'; 
        // Unsure where to go from here. The above line
        // gets the index of the outer ArrayList but I 
        // don't know how to add it to that ArrayList only
    }
}

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

1 Ответ

0 голосов
/ 19 мая 2019

Я бы рекомендовал использовать Map вместо вложенных списков.Вы можете использовать Java Streams для достижения этого:

Map<Character, List<MusicTrack>> titles = tracks.stream()
        .collect(Collectors.groupingBy(track -> Character.toUpperCase(track.getTitle().charAt(0))));

Если вы хотите, чтобы карта сортировалась по ключу, вы можете использовать TreeMap для этого:

Map<Character, List<MusicTrack>> titles = tracks.stream()
        .collect(Collectors.groupingBy(track -> Character.toUpperCase(track.getTitle().charAt(0)), TreeMap::new, Collectors.toList()));

Наконец, если выдействительно нужно использовать вложенные списки, вы также можете снова преобразовать карту, используя Map.values():

List<List<MusicTrack>> titles = new ArrayList<>(tracks.stream()
        .collect(Collectors.groupingBy(track -> Character.toUpperCase(track.getTitle().charAt(0)), TreeMap::new, Collectors.toList()))
        .values());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...