Как отфильтровать переменную списка объекта в Java? - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть объект Student

public class Student {
   String name;
   String[] classes;

    public Student(String name, String[] classes){
        this.name = name;
        this.classes = classes;
    }

   //getter & setter
}

Я хочу отфильтровать классы. Например, у меня есть

Student sa = new Student("John", "math, physics")
Student sb = new Student("Jack", "math, english")
Student sc = new Student("Maria", "math, chemistry")

Итак, как мне получить Student с math vairable? Нужно ли мне писать новый предикат или существует существующий метод? Спасибо.

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

Ваш код неверен.

Первое: если вашему конструктору требуется параметр String[], вы должны указать String[], а не String. Назовите это так:

Student sa = new Student("John", new String[]{"math", "physics"});
Student sb = new Student("Jack", new String[]{"math", "english"});
Student sc = new Student("Maria", new String[]{"math", "chemistry"});

Вы должны сделать ваши поля приватными и использовать геттеры вместо того, чтобы делать их закрытыми. Вы можете прочитать о видимости здесь

Теперь у вас есть три Student объекта. Вы не можете поместить их в поток самым простым способом, как это:

Arrays.stream(new Student[]{sa, sb, sc})

Теперь вы можете фильтровать поток примерно так:

Arrays.stream(new Student[]{sa, sb, sc})
    .filter(s -> {
        for(String className : s.classes) {
            if(className.equals("math")) return true;
        }
        return false;
    })

, который даст вам поток всех учеников, которые имеют класс math в своем поле classes. Теперь вы можете собирать свои элементы или больше работать с ним.

0 голосов
/ 30 апреля 2018

Если у вас есть List<Student>, заполненный правильными данными, вы можете выполнить задачу под рукой так:

List<Student> result = 
     students.stream()
             .filter(student -> Arrays.stream(student.getClasses())
                                      .anyMatch("math"::equals))
             .collect(Collectors.toList());

Это создает поток из списка учеников и фильтрует их, чтобы сохранить только учеников, у которых есть "математический" класс.

0 голосов
/ 30 апреля 2018

Вы можете использовать отдельный метод find, чтобы найти класс в массиве:

List<Student> mathStudents = studentList.stream()
                  .filter(student -> findClass(student.getClasses(), "math"))
                  .collect(Collectors.toList());

Сортировка необходима для бинарного поиска, но лучше выполнить поиск, предпочтительно в конструкторе Student, как , предложенное AlexH

private static boolean findClass(String[] classes, String search) {

    Arrays.sort(classes); 
    return 0 <= Arrays.binarySearch(classes, search);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...