繁体   English   中英

将列表分组和排序到 Map

[英]Grouping and sorting Lists into a Map

首先,标题并没有传达我真正想问的内容。 我想知道的是,我怎样才能制作一个 map,对于几个用户,它会收集他们的数据,然后将它们组合在一起。 我目前正在使用两个列表,一个用于用户名,另一个用于他们的作品。 我尝试使用 map.put 但它一直覆盖上一个条目。 所以我想获得如下;

所需的 output:

{user1 = work1, work2, work3 , user2 = work1, work2 , userN = workN} 

当前 output:

{[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";
}

感谢所有帮助!

我会试一试(有问题的代码仍然不适合我):

如果我理解正确,您需要一个 Map,其中包含每个用户的存储库。 因此,我认为repositoriesUserData应该是Map<String, List<String>

考虑到这一点,让我们在每个循环周期中填充 map,列表中的用户作为键,存储库名称列表作为值。

该方法看起来像这样(删除临时返回并用 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”。
  • 在方法结束时,您在 map repositoriesUserData中添加一个新条目。

这意味着在方法结束时,您只需向 map 添加一个条目,其中

  • key = 所有用户
  • value = 来自用户的所有存储库(因为它是一个列表,如果两个用户具有相同的存储库,则将他们两次添加到此列表中)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM