如何在Java中更改hashmap列表中值的位置

如何在Java中更改hashmap列表中值的位置,java,arraylist,hashmap,Java,Arraylist,Hashmap,很抱歉问了另一个非常明显的问题-我正在努力解决哈希映射 我想做的是改变值在hashmap中存储的列表中的存储顺序,我不想使用迭代器 例如,一所学校有一份课程列表,每门课程都有一份学生列表。在那里,霍尔班长的工作是随机挑选的课程名单上的第一个学生。当选择一门课程时,位于列表顶部的学生将被放在他们所参加的所有课程的列表底部。共有9门课程,一名学生可以出现在多个学生名单上 我正试图按照以下思路做一些事情: //instance variable private HashMap<String, S

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

我想做的是改变值在hashmap中存储的列表中的存储顺序,我不想使用迭代器

例如,一所学校有一份课程列表,每门课程都有一份学生列表。在那里,霍尔班长的工作是随机挑选的课程名单上的第一个学生。当选择一门课程时,位于列表顶部的学生将被放在他们所参加的所有课程的列表底部。共有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);
    }
  }

  }
//实例变量
私人HashMap合格学生;
qualifiedStudents=newhashmap();
public void putStudentLastInRosters(字符串studentName)
{
对于(字符串课程:qualifiedStudents.keySet())
{
if(qualifiedStudents.get(course.contains)(studentName))
{
合格学生。删除(课程,学生姓名);
合格学生。put(课程,学生姓名);
}
}
}
考虑执行此任务

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

尝试以下方法:

//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);
        }
    }
}
//实例变量
私人HashMap合格学生;
qualifiedStudents=newhashmap();
公共字符串putStudentLastInRosters(字符串studentName){
对于(字符串课程:qualifiedStudents.keySet()){
列出学生=合格学生。获取(课程);
if(students.remove(studentName)){
添加(studentName);
}
}
}

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

for (List<String> list : qualifiedStudents.values()) {
    if (list.remove(studentName)) {
        list.add(studentName);
    }
}
for(列表:qualifiedStudents.values()){
如果(列表移除(学生姓名)){
列表。添加(学生姓名);
}
}

如果我理解正确,您只需在每个课程的每个列表中对学生重新排序即可

    for(List<String> studentsInCourse : qualifiedStudents.values()) {
        if (studentsInCourse.remove(studentName)) {
            studentsInCourse.add(0, studentName);
        }
    }
for(列出学生课程:qualifiedStudents.values()){
if(studentsInCourse.remove(studentName)){
studentsInCourse.add(0,studentName);
}
}

现在,当HashMap的值类型为字符串数组时,您似乎正在尝试从HashMap中删除字符串对象,并将其放入HashMap中

如果您有:

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

您希望获得对字符串数组的引用(我相信是“课程”),并在其中移动studentName字符串。正如barsju所说,使用ArrayList可能比使用字符串数组容易。

下面将返回类中学生的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);
    }
  }

  }
//实例变量
private HashMap qualifiedStudents=new HashMap();
public void putStudentLastInRosters(字符串studentName)
{
对于(字符串课程:qualifiedStudents.keySet())
{
if(qualifiedStudents.get(course.contains)(studentName))
{
合格学生。获取(课程)。删除(学生姓名);
合格学生。获取(课程)。添加(学生姓名);
}
}
}

能否将字符串[]更改为ArrayList?很抱歉,我本应该更精确地显示它的初始化方式,列表是ArrayList字符串。也许我没有理解您的问题,但也许您正在努力,因为映射中的顺序是由迭代器保证的。来自:“映射的顺序定义为映射集合视图上的迭代器返回其元素的顺序。一些映射实现(如TreeMap类)对其顺序做出特定保证;其他映射实现(如HashMap类)则不这样做。”是的,100%,但我希望他们在列表的末尾,而不是在ArrayList中的第一个位置。