计算大多数频率。用户在一个数组中

时间:2015-12-02 06:48:48

标签: java

    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

谢谢,如果您需要更多详细信息,请与我们联系。

3 个答案:

答案 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 + =问题
假设我们列表中有两门课程cs150cs160
最初,

courseMessage = "Courses : ";
separator = "";

首节课程cs150

courseMessage += separator += singleCourse;
=>
couresMessage += separator = separator + "cs150";
=>
courseMessage += separator = "cs150";
=>
courseMessage += "cs150";
=> courseMessage = "Courses : cs150";

因此,在第一次迭代后,courseMessage将为Courses : cs150separator将为cs150
在这里,您意外地修改了separator的值,这将反映在随后的迭代中,您将获得意外的输出。