将列表分组和排序到地图中
Posted
技术标签:
【中文标题】将列表分组和排序到地图中【英文标题】:Grouping and sorting Lists into a Map 【发布时间】:2022-01-04 17:51:27 【问题描述】:首先,标题并没有表达我真正想问的问题。 我想知道的是,我怎样才能制作地图,为几个用户收集他们的数据,然后将它们组合在一起。我目前正在使用两个列表,一个用于用户名,另一个用于他们的作品。我尝试使用 map.put 但它一直覆盖上一个条目。所以我想得到如下;
期望的输出:
user1 = work1, work2, work3 , user2 = work1, work2 , userN = workN
当前输出:
[user1, user2, user3, user4]=[work1, work2, work3, work4, work5 (user1) , work1 (user2), work1, work2, work3 ( user3 )]
这是我目前用来实现上述目标的代码。
private static Map<List<String>, List<String>> repositoriesUserData = new HashMap<>();
private static Set<String> collaboratorNames = new HashSet<>();
public static void main(String[] args) throws Exception
login();
getCollabs(GITHUB_REPO_NAME);
repositoriesUnderUser();
public GitManager(String AUTH, String USERNAME, String REPO_NAME) throws IOException
this.GITHUB_LOGIN = USERNAME;
this.GITHUB_OAUTH = AUTH;
this.GITHUB_REPO_NAME = REPO_NAME;
this.githubLogin = new GitHubBuilder().withOAuthToken(this.GITHUB_OAUTH, this.GITHUB_LOGIN).build();
this.userOfLogin = this.githubLogin.getUser(GITHUB_LOGIN);
public static void login() throws IOException
new GitManager(GIT_TOKEN, GIT_LOGIN, GITHUB_REPO_NAME);
connect();
public static void connect() throws IOException
if (githubLogin.isCredentialValid())
valid = true;
githubLogin.connect(GITHUB_LOGIN, GITHUB_OAUTH);
userOfLogin = githubLogin.getUser(GITHUB_LOGIN);
public static String getCollabs(String repositoryName) throws IOException
GHRepository collaboratorsRepository = userOfLogin.getRepository(repositoryName);
collaboratorNames = collaboratorsRepository.getCollaboratorNames();
String collaborators = collaboratorNames.toString();
System.out.println("Collaborators for the following Repository: " + repositoryName + "\nAre: " + collaborators);
String out = "Collaborators for the following Repository: " + repositoryName + "\nAre: " + collaborators;
return out;
public static List<String> fillList()
List<String> collaborators = new ArrayList<>();
collaboratorNames.forEach(s ->
collaborators.add(s);
);
return collaborators;
public static String repositoriesUnderUser() throws IOException
GHUser user;
List<String> names = new ArrayList<>();
List<String> repoNames = new ArrayList<>();
for (int i = 0; i < fillList().size(); i++)
user = githubLogin.getUser(fillList().get(i));
Map<String, GHRepository> temp = user.getRepositories();
names.add(user.getLogin());
temp.forEach((c, b) ->
repoNames.add(b.getName());
);
repositoriesUserData.put(names,repoNames);
System.out.println(repositoriesUserData);
return "temporaryReturn";
感谢所有帮助!
【问题讨论】:
repositoriesUserData
是什么数据类型?
是,私有静态 Map,ListGHUser
,GHRepository
,fillList
,githubLogin
是什么?
它来自包github-api.kohsuke.org。但即使你添加了依赖,它也不会编译
@Box 我认为你应该提供一个可运行的代码
【参考方案1】:
我会试一试(有问题的代码仍然不适合我):
如果我理解正确,您需要一个包含每个用户的存储库的地图。
所以我认为repositoriesUserData
应该是Map<String, List<String>
。
考虑到这一点,让我们在每个循环周期中填充映射,其中列表中的用户作为键,存储库名称列表作为值。
该方法看起来像这样(删除临时返回并用 void 替换它)
public static String repositoriesUnderUser() throws IOException
for (int i = 0; i < fillList().size(); i++)
GHUser user = githubLogin.getUser(fillList().get(i));
Map<String, GHRepository> temp = user.getRepositories();
repositoriesUserData.put(user.getLogin(), temp.values().stream().map(GHRepository::getName).collect(Collectors.toList()));
return "temporaryReturn";
编辑:(简短说明您的代码中发生了什么)
您正在将所有用户名收集到本地列表names
,并将所有存储库名称添加到本地列表“repoNames”。
在方法结束时,您将一个新条目放入您的地图repositoriesUserData
。
这意味着在方法结束时,您只需将一个条目添加到地图中
key = 所有用户 value = 来自用户的所有存储库(因为它是一个列表,如果两个用户拥有相同的存储库,则会将他们两次添加到此列表中)【讨论】:
Holy molly,即使你说它不起作用,从字面上看,它是为我做的。它确实按照我的意愿给出了它。你能给我解释一下吗?到目前为止,你似乎比我知道的更多哈哈 试图添加一个简短的解释你的代码发生了什么错误。 @Box a map 是一个键值对。将键视为您有兴趣获取的值的唯一标识符。如果您正在处理数据库表,则表的主键将是键,然后每隔一列将是值。在 99.99999% 的情况下,密钥将是一个简单的数据类型,例如String
。很少(我不记得曾经见过这样的案例)您会使用列表之类的东西作为键。以上是关于将列表分组和排序到地图中的主要内容,如果未能解决你的问题,请参考以下文章