0

很抱歉问了另一个非常明显的问题 - 我正在努力解决哈希图..

我想要做的是更改值存储在存储在哈希图中的列表中的顺序,并且我不想使用迭代器。

例如,一所学校有一个课程列表,每门课程都有一个学生列表。那里的大厅监控工作是随机挑选的课程名单上的第一个学生。选择一门课程后,列表顶部的学生将被放在他们所属的所有课程的列表底部。有 9 门课程,一个学生可以出现在多个学生列表中。

我正在尝试按照以下方式做一些事情:

//instance variable
private HashMap<String, String[]> qualifiedStudents;
    qualifiedStudents = new HashMap<String, List<String>>();

  public void putStudentLastInRosters(String studentName)
  {
   for(String course : qualifiedStudents.keySet())
   {
      if(qualifiedStudents.get(course).contains(studentName)) 
    {
       qualifiedStudents.remove(course, studentName); 
       qualifiedStudents.put(course, studentName);
    }
  }

  }
4

6 回答 6

1

试试这个:

//instance variable
private HashMap<String, List[]> qualifiedStudents;
    qualifiedStudents = new HashMap<String, List<String>>();

public String putStudentLastInRosters(String studentName) {
    for(String course : qualifiedStudents.keySet()) {
        List<String> students = qualifiedStudents.get(course);
        if(students.remove(studentName)) {
            students.add(studentName);
        }
    }
}
于 2012-04-19T13:17:14.187 回答
1

您需要修改列表,而不是地图。所以代码应该是:

for (List<String> list : qualifiedStudents.values()) {
    if (list.remove(studentName)) {
        list.add(studentName);
    }
}
于 2012-04-19T13:17:46.577 回答
0

为此任务考虑SortedMap 。

实现您自己的比较器以反映您要使用的排序顺序。

于 2012-04-19T13:17:13.927 回答
0

如果我理解正确,您只想在每门课程的每个列表中重新排序学生。

    for(List<String> studentsInCourse : qualifiedStudents.values()) {
        if (studentsInCourse.remove(studentName)) {
            studentsInCourse.add(0, studentName);
        }
    }
于 2012-04-19T13:18:09.967 回答
0

现在,当 HashMap 的值类型是 String 数组时,您似乎正在尝试从 HashMap 中删除和放入 String 对象。

你在哪里:

   qualifiedStudents.remove(course, studentName); 
   qualifiedStudents.put(course, studentName);

您想要获取对 String 数组的引用(我相信“课程”)并在其中移动 studentName 字符串。就像barsju所说,使用ArrayList可能比使用String数组更容易。

于 2012-04-19T13:18:56.130 回答
0

以下将返回班级中学生的 ArrayList,并允许您执行删除和添加操作。我们只需要删除 studentsName 并读取它。在链表中,这会将其添加到 ArrayList 的末尾。

qualifiedStudents.get(course)

我重新声明了你的 HashMap。

    //instance variable
private HashMap<String, ArrayList<String>> qualifiedStudents = new HashMap<String, ArrayList<String>>();

  public void putStudentLastInRosters(String studentName)
  {
   for(String course : qualifiedStudents.keySet())
   {
      if(qualifiedStudents.get(course).contains(studentName)) 
    {
       qualifiedStudents.get(course).remove(studentName); 
       qualifiedStudents.get(course).add(studentName);
    }
  }

  }
于 2012-04-19T13:22:49.833 回答