使用HashMap创建多个ArrayList

3

我有一个名为Student的类,它有一个String属性date。我有所有学生的列表,现在我想创建多个按date分组的ArrayLists

我想使用哈希图:

ArrayList students = getStudents();

Map map<String, ArrayList<Student>> = new HashMap<String, ArrayList<Student>);

for (Student i: students) {
 // There must be something
}

我该如何创建多个学生ArrayList,这些ArrayList根据其属性的字符串值进行分组?
3个回答

5

最简单的方法是使用Java 8流:

Map<String, List<Student>> map =
    students.stream()
            .collect(Collectors.groupingBy(Student::getDate));

这里的getDateStudent类的一个方法,你可以通过它来对Student进行分组。

要完成Java 8之前代码的答案,

Map<String, List<Student>> map = new HashMap<>();
for (Student s : students) {
    List<Student> list = map.get(s.getDate());
    if (list == null) {
        list = new ArrayList<Student>();
        map.put (s.getDate(), list);
    }
    list.add (s);
}

我使用Java 7,但是没有这样的方法。 - zxcdsa980
如果你不能使用Java 8,那么你就得用一种比较麻烦的方式来做(其实也不是很麻烦)- 遍历所有的学生。对于每个学生,检查map.containsKey(student.getDate())是否为真。如果是,将该学生添加到该日期的ArrayList中。如果不是,创建一个新的ArrayList,将学生添加到其中,并以日期作为键将其放入map中。 - Eran
谢谢,但您能给我一个示例代码吗? - zxcdsa980

3

试试这个:

Map<String, List<Student>> map= new HashMap<String, List<Student>();
List<Student> list;
for (Student student: students) {
  list = map.get(student.getDate());
  if (list == null) {
      list = new ArrayList<Student>();
      map.put(student.getDate(), list);
  } 
  list.add(student);
}

0

这个想法是检查在映射中是否已经存在日期。如果存在,则将学生添加到相应的列表中。如果不存在,则添加一个新列表,其中学生作为新列表中的第一条记录。

以下是有效的内容。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

    public class Main {

        public static void main(String[] args) {
            ArrayList<Student> students = getStudents();

            Map<String, ArrayList<Student>> map = new HashMap<String,      ArrayList<Student>>();

            for (Student i : students) {
               if (map.containsKey(i.getDate())) {
                  map.get(i.getDate()).add(i);
               } else {
                  ArrayList<Student> newList = new ArrayList<Student>();
                  newList.add(i);
                  map.put(i.getDate(), newList);
               }
            }

            System.out.println(map);
        }

    private static ArrayList<Student> getStudents() {
        ArrayList<Student> list = new ArrayList<Student>();
        list.add(new Student("Hari", "12/05/2015"));
        list.add(new Student("Zxc", "14/05/2015"));
        list.add(new Student("Bob", "12/05/2015"));
        list.add(new Student("Ram", "14/05/2015"));

        return list;
    }

}

class Student {
    public Student(String name, String date) {
        this.name = name;
        this.date = date;
    }

    private String name;
    private String date;

    public String getDate() {
        return date;
    }

    @Override
    public String toString() {
        return name;
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接