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);