我有两个存储在数组中的对象:
Game(String creator, String title, int releaseYear, int NumberSold)
Creator(String name, String gamesWorkedOn)
Game(creator)
有多个创建者,因此存储为如下字符串:"creator1, creator2, creator3"
使用逗号分隔其值。
并非所有游戏都有多个创作者,并且总共没有很多不同的创作者。
我要做的是循环遍历Game(games)
数组并从中提取创建者变量并将其分配给Creator(name)
,然后匹配任何提及创建者的游戏并分配这些标题变量为Creator(gamesWorkedOn)
。
到目前为止,我有这个:
public static void PopulateCreators(ArrayList<Game> games) {
//populating an array of Creators with games they have worked on
boolean match = false;
String thisCreator;
String gamesWorkedOn;
ArrayList<Creator> creatorArray = new ArrayList<Creator>();
for (int i = 0; i < games.size(); i++) {
thisCreator = games.get(i).getGameCreator();
thisCreator = thisCreator.replaceAll(", ", "\n");
使用sysout为我提供了这个输出:
Shigeru Miyamoto
Satoshi Tajiri
Yoshiaki Koizumi
Koichi Hayashida
Shigeru Miyamoto
我想要的输出是这样的:
name = "Shigeru Miyamoto"
gamesWorkedOn = "game1, game2, game3"
我正在考虑使用for循环,但我不确定如何在这里实现它。
编辑:
我忘了提到一些我认为不重要的细节,但现在我会更清楚一些。这是我正在研究的基于Swing的项目,它接受用户输入并存储这些数组,然后将这些数组保存到JSON文件中,该文件在加载应用程序时以及当用户单击“保存”按钮时读取。
答案 0 :(得分:1)
您似乎想要做的是将创作者映射到他们创建或帮助创建的所有游戏。我将首先创建问题的简化版本。
您有以下列表:
class Game {
Set<Creator> creators;
}
您要转换为:
Map<Creator, Set<Game>> createdGames; // Map of creator name to games created
这里要做的第一件事是找到所有独特的创作者开始添加到地图。这可以使用流API完成。
createdGames = gameList.stream().flatMap(game -> game.creators.stream()).distinct().collect(Collectors.toMap(Function.identity(), v -> new HashSet<>()));
现在你可以再次浏览所有游戏,并将游戏添加到创作者的集合中,如果他们参与了该游戏的创作。
for(Game game : gameList) {
for(Creator creator : createdGames.keySet()) {
if(game.creators.contains(creator)) {
createdGames.get(creator).add(game);
}
}
}