将对象添加到ArrayLists的ArrayList中

时间:2019-05-18 22:55:30

标签: java object arraylist

我有一个包含MusicTrack对象的ArrayList的ArrayList。我想为字母表中的每个字母创建一个数组列表,然后在其中包含以该字母开头的所有曲目。我在将MusicTrack对象添加到这些内部ArrayList时遇到麻烦。

例如:titles [0]保留所有以A开头的曲目,依此类推,直到title [26]保留Z曲目。 MusicTrack对象具有一个名为getTitle()的getter方法,用于返回标题字符串以进行比较。

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 :(得分:0)

我建议使用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());