【问题标题】:Having trouble accessing and referring to HashMap in Java在 Java 中访问和引用 HashMap 时遇到问题
【发布时间】:2019-04-11 07:54:23
【问题描述】:

我正在尝试编写一个程序来处理学生和相应科目的存储,但对 Java 的列表相对较新,并且无法让班级存储和输出学生和科目。到目前为止,我可以让它存储一个学生和班级,但不会占用多个,或者只返回最近添加的一个。

private static Map<String, Set<String>> cohort = new HashMap<~>();

public static void signOn(String class, String student) {
    Set<String> studentSet = new HashSet<String>();
    studentSet.add(student);
    cohort.put(class, studentSet);
}

public static Map<String, Set<String>> getCohort() {
    return cohort;
}

调用getCohort() 时,我试图让它返回所有已登录的学生,但它只返回最近添加的学生。我不确定我是否遗漏了一些简单的东西,但我可以'似乎没有得到它的权利,任何帮助将不胜感激。

【问题讨论】:

    标签: java arrays oop hashmap set


    【解决方案1】:

    signOn 中,当您添加新学生时,您正在创建一个新集合,向其中添加一个学生,然后覆盖任何已经存在的集合。这意味着您将永远只有一名学生。

    您需要做的是首先获取班级中的当前学生集,然后将您的学生添加到他们中。

    示例代码:

        public static void signOn(String class, String student)
        {
            Set<String> studentSet = cohort.get(class);
            if (studentSet == null) {
                studentSet = new HashSet<String>();
                cohort.put(class, studentSet);
            }
            studentSet.add(student);
        }
    

    这应该起作用,因为 studentSet 将是对存储在队列中的 studentSet 的引用。我只是凭记忆写的,所以没有保证它在第一次尝试时会起作用,但这是一般的想法。

    【讨论】:

      【解决方案2】:

      您总是在创建一个新集合,从而覆盖您在同类群组中保存的现有集合。

      尝试以下方法:

      Set<String> studentSet = cohort.get(class);
      if(studentSet == null){
        studentSet = new HashSet<String>();
        cohort.put(class, studentSet);
      }
      studentSet.add(student);
      

      作为旁注,我想补充一点,'class' 并不是 String 变量的最佳名称,因为它是 Java 保留字。

      【讨论】:

        【解决方案3】:

        您在输入new Set every time 时遇到了问题(同样当学生班级相同时),这基本上会覆盖旧值。因此,如果班级相同,则需要将学生放在同一组中。使用 Java 8,您可以执行以下操作:-

        public static void signOn(String cls, String student) {
            cohort.computeIfAbsent(cls, k -> {
                Set<String> studentSet = new HashSet<>();
                studentSet.add(student);
                return set;
            });
        
            cohort.computeIfPresent(cls, (k, v) -> {
                v.add(student);
                return v;
            });
        }
        

        注意:不能有变量名class,它是java中的保留关键字。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多