将列表分组和排序到地图中

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,List> repositoriesUserData = new HashMap();。忘记说了。 你的代码连编译都没有,GHUserGHRepositoryfillListgithubLogin是什么? 它来自包github-api.kohsuke.org。但即使你添加了依赖,它也不会编译 @Box 我认为你应该提供一个可运行的代码 【参考方案1】:

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

如果我理解正确,您需要一个包含每个用户的存储库的地图。 所以我认为repositoriesUserData 应该是Map&lt;String, List&lt;String&gt;

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

该方法看起来像这样(删除临时返回并用 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。很少(我不记得曾经见过这样的案例)您会使用列表之类的东西作为键。

以上是关于将列表分组和排序到地图中的主要内容,如果未能解决你的问题,请参考以下文章

JAVA将快速将列表分组并排序键

在python中以某列为分组对象还能对某列进行依次排序吗

在 Python 中对嵌套列表进行排序和分组

mysql进阶5:分组查询

学不会的python之通过某几个关键字排序分组一个字典列表(列表中嵌套字典)

学不会的python之通过某几个关键字排序分组一个字典列表(列表中嵌套字典)