int totalEnrolled = studentEnrollments.size();
String mostFreqUser = "";
int count = 0;
System.out
.println("~~~~~~~~~~~~~~~Spring 2016 Enrollment~~~~~~~~~~~~~~~");
for (String userName : studentEnrollments.keySet()) {
System.out.println("Student: " + userName);
ArrayList<String> courses = studentEnrollments.get(userName);
String courseMessage = "Courses: ";
String seperator = "";
// looping through courses
for (String singleCourse : courses) {
// counting how many courses were enrolled
count++;
courseMessage += seperator += singleCourse;
System.out.println(courseMessage);
seperator = ",";
}
}
System.out.println("Total students enrolled: " + totalEnrolled);
System.out.println("Total courses enrolled: " + count);
System.out.println(mostFreqUser);
}
}
您好,我想知道如何为最常用的用户制作计数器。每次for循环运行它会计算谁最多放置用户名。还有一件事,为什么输出打印多个课程,而不是每个名称一个。例如,不是为每个课程打印一个课程,而是打印两次。
例如预期输出看起来像
学生:乔什 课程:cs170,cs180
但输出看起来像
学生:乔什 课程:cs170 课程:cs170,cs170
谢谢,如果您需要更多详细信息,请与我们联系。
答案 0 :(得分:1)
将print语句移到内部for
循环之外。
注意:它拼写了&#34; sep a rator&#34;。
请勿进行链式+=
。
注意:如果您看到学生多次列出相同的课程名称,那么您的studentEnrollments
地图列表可能是错误的,而不是您显示的代码。
以下代码还说明了如何找到课程数量最多的学生(又名&#34; mostFreqUser&#34;)。当然,不止一个学生可以参加很多课程,但只会展示第一个课程。
System.out.println("~~~~~~~~~~~~~~~Spring 2016 Enrollment~~~~~~~~~~~~~~~");
int courseTotal = 0;
int maxCourseCount = 0;
String maxCourseStudent = "";
for (String student : studentEnrollments.keySet()) {
System.out.println("Student: " + student);
ArrayList<String> courses = studentEnrollments.get(student);
String courseMessage = "Courses: ";
String separator = "";
for (String course : courses) {
courseMessage = courseMessage + separator + course;
separator = ",";
}
System.out.println(courseMessage);
courseTotal += courses.size();
if (courses.size() > maxCourseCount) {
maxCourseCount = courses.size();
maxCourseStudent = student;
}
}
System.out.println("Total students enrolled: " + studentEnrollments.size());
System.out.println("Total courses enrolled: " + count);
System.out.println("Most frequent student: " + maxCourseStudent + " (enrolled in " + maxCourseCount + " courses)");
答案 1 :(得分:0)
对于第一部分,您可以使用Hashtable。每当第一次看到用户时,使用值1初始化哈希表。随后,如果再次看到用户,则递增哈希表计数。最后,遍历哈希表的每个元素以找到最大值。
对于第二部分,您需要将第二个print语句置于for循环之外。
答案 2 :(得分:0)
您正在课程循环中打印courseMessage
。因此,它将为课程集合中的每门课程打印courseMessage
。这就是你获得两个输入的原因。
以下声明也会影响您的输出
courseMessage += seperator += singleCourse;
这应该写成
courseMessage += seperator + singleCourse;
DEMO FOR + =问题
假设我们列表中有两门课程cs150
和cs160
。
最初,
courseMessage = "Courses : ";
separator = "";
首节课程cs150
,
courseMessage += separator += singleCourse;
=>
couresMessage += separator = separator + "cs150";
=>
courseMessage += separator = "cs150";
=>
courseMessage += "cs150";
=> courseMessage = "Courses : cs150";
因此,在第一次迭代后,courseMessage
将为Courses : cs150
,separator
将为cs150
。
在这里,您意外地修改了separator
的值,这将反映在随后的迭代中,您将获得意外的输出。