首页 > 解决方案 > 哈希集没有它应该有的值。实例化问题

问题描述

嘿,我想我有一些逻辑问题,但我真的看不出它在哪里。我知道问题出在 HashSet 之间,但就是这样。

我正在使用 HashMap,键是 numberOfEpisode,值是 HashSet。因此,如果我的数组列表中的这些动画具有相同数量的情节,例如 12,则将它们添加到新的 HashSet 中,然后添加到 HashMap 中。

代码

HashSet<Strings> animeNames;
for(Anime anime : animius.getListOfAnime){
    animeNames = new HashSet<>();
    for(Anime anime2 : animius.getListOfAnime){
        for(Episode episode : anime.getListOEpisode){
            for(Episode episode2 : anime2.getListOfEpisode{

                if(episode.getNumber == episode2.getNumber){
                    animeNames.add(anime.getName);
                    animius.getEpisodeAndAnimeIndex.put(episode.getNumber, animeNames)
                } 
            }
        }  
    }

}

输出

格式化后。假设只有动漫1 与动漫 2 有相似之处,但动漫 2 有 2 个键,一个有 12 集,另一个有 24 集。

12 ---- 日本动漫1, 日本动漫2 <--- 这是正确的

24 ----anime1,anime2 <---这是错误的

预期产出

12----动漫1,动漫2

24----动漫2

尝试的解决方案

我创建了 2 个 HashSet,其中一个包含anime.getName 的值,另一个包含anime2.getName。

我还尝试在 for each 循环中以不同的方式放置animeNames 和animeNames2 的新实例

标签: javacollectionsjava-8hashmaphashset

解决方案


如果我没有误解你,你不需要有 4 个嵌套的 for 循环。您只想检查您收藏中的每个动漫它们有多少集并将其存储。基本上按集数将动漫组合在一起。下面的代码就是这样做的。

HashMap<Integer, Set<Anime>> animeMap = new HashMap<>();
for(Anime anime : animius.getListOfAnime){

    int numberOfEpisodes = anime.getListOEpisodes().size(); 
    if (animeMap.contains(numberOfEpisodes) {
      animeMap.get(numberOfEpisodes).add(anime);
    } else {
      HashSet<Anime> animeNames = new HashSet<>();
      animeNames.add(anime);
      animeMap.put(numberOfEpisodes, animeNames);
    }

}

推荐阅读