Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 集合列表正在返回重复项_Java_List_Collections_Set - Fatal编程技术网

Java 集合列表正在返回重复项

Java 集合列表正在返回重复项,java,list,collections,set,Java,List,Collections,Set,嘿,我正在实现这个功能 private static HashMap<String, Set<String>> enrollments = new HashMap<String, Set<String>>(); private static Set<String> studentset; /** * Enrolls a student into a unit. * * @param unit * @param student

嘿,我正在实现这个功能

private static HashMap<String, Set<String>> enrollments = new HashMap<String, Set<String>>();
private static Set<String> studentset;
/**
 * Enrolls a student into a unit.
 * 
 * @param unit
 * @param student
 */
public static void enroll(String unit, String student) {

    if(!enrollments.containsKey(unit)) {
        studentset = new HashSet<String>();
    }
    studentset.add(student);
    enrollments.put(unit, studentset);

}


/**
     * Gets a list of all students of a particular discipline. E.g. If discipline is
     * "ABC" then return a collection of all students enrolled in units that start
     * with "ABC", so ABC301, ABC299, ABC741 etc. This method is non-trivial so it
     * would help to first implement the helper method matchesDiscipline (below).
     * 
     * @param discipline
     * @return
     */

    public static Set<String> getStudents(String discipline) {

        Set<String> myList = new HashSet<String>();

        for (Entry<String, Set<String>> e : enrollments.entrySet()) {
            if (e.getKey().startsWith(discipline)) {

                myList.addAll(e.getValue());

            }
        }

        return myList;
    }

public static void main(String[] args) {
        EnrollmentManager.enroll("CAB302", "James");
        EnrollmentManager.enroll("CAB403", "Ben");
        EnrollmentManager.enroll("CAB302", "James");
        EnrollmentManager.enroll("CAB403", "Morgan");
        EnrollmentManager.enroll("CAB404", "Sam");
        System.out.println(EnrollmentManager.getStudents("CAB3"));
    }
私有静态HashMap注册=新建HashMap();
私有静态集studentset;
/**
*让学生进入一个单元。
* 
*@param单位
*@param学生
*/
公共静态无效注册(字符串单位,字符串学生){
如果(!注册。容器(单位)){
studentset=newhashset();
}
studentset.add(学生);
注册。put(单位,学生集);
}
/**
*获取特定学科的所有学生的列表。例如,如果纪律不严
*“ABC”然后返回在开始学习的单元中注册的所有学生的集合
*有了“ABC”,所以ABC301、ABC299、ABC741等等。这种方法非常简单,所以
*将有助于首先实现helper方法matchesrecution(如下)。
* 
*@param纪律
*@返回
*/
公共静态设置getStudents(字符串规程){
Set myList=new HashSet();
对于(条目e:enrollments.entrySet()){
if(例如getKey().startsWith(规程)){
myList.addAll(e.getValue());
}
}
返回myList;
}
公共静态void main(字符串[]args){
注册经理。注册(“CAB302”,“詹姆斯”);
注册经理。注册(“CAB403”,“本”);
注册经理。注册(“CAB302”,“詹姆斯”);
注册经理。注册(“CAB403”,“摩根”);
注册经理。注册(“CAB404”、“Sam”);
System.out.println(registrmentmanager.getStudents(“CAB3”);
}

我遇到的问题是“myList”正在输出[摩根、詹姆斯、本]。正确答案应该是[詹姆斯]。我哪里做错了?抱歉,如果这是一个简单的解决方案,我是新的集合

代码的问题在于您使用的是静态
studentSet
变量。让我试运行你的代码

这里要做的是,在找不到键时创建一个新的集合,否则将使用现有集合,该集合是静态成员

if(!enrollments.containsKey(unit)) { 
    studentset = new HashSet<String>();
}

您可以更改您的注册方法,如下所示:

public static void enroll(String unit, String student) {

    if(!enrollments.containsKey(unit)) {
        studentset = new HashSet<String>();
        enrollments.put(unit, studentset);
    } else {
        studentset = enrollments.get(unit);
    }
    studentset.add(student);

}
公共静态无效注册(字符串单位,字符串学生){
如果(!注册。容器(单位)){
studentset=newhashset();
注册。put(单位,学生集);
}否则{
studentset=注册。获取(单位);
}
studentset.add(学生);
}

您的错误:您有一个静态引用
私有静态集studentset
在您的情况下,当
时,它用于在map的上一个条目中添加新学生!enrollments.containsKey(单位)
返回false。最佳做法是将其设置为局部变量并在enroll方法中定义。

问题在于您的静态变量
studentset
,并且您正在向该集合添加,即使
studentset
已存在于
单元的映射中。如果找到密钥,则应将其添加到地图中已存在的集合中

如果您使用的是Java 8或更高版本,只需一行即可:

enrollments.computeIfAbsent(unit, k -> new HashSet<>()).add(student);
registrations.computeIfAbsent(单位,k->newhashset()).add(学生);

您根本不需要
studentset
静态字段

您可以粘贴您的
enroll
函数吗?另外,预期的输出不应该是James吗?由于
e.getKey().startsWith(规程)
将与您的输入“CAB3”匹配,并且根据您的数据,只有James似乎与之匹配。我已更新帖子,如果地图是
@Sam,则更有意义。您的问题解决了吗?
enrollments.computeIfAbsent(unit, k -> new HashSet<>()).add(student);