Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Фильтр в ObservableList<>, Как пользоваться filter 
:(
    Опции темы
Elfix
Дата 3.1.2016, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 13.7.2005

Репутация: нет
Всего: нет



Привет!

Новичек в Java, поэтому возможно часть вопросов несколько глупые.
Работаю в Java 8. Есть такой код:

Код

package test;

import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;

public class Student {
    private SimpleIntegerProperty age;
    private SimpleStringProperty surname;
    private SimpleStringProperty name;
    private Region region;

    public Student(String surname, String name, Integer age, Region region) {
        this.surname = new SimpleStringProperty(surname);
        this.name = new SimpleStringProperty(name);
        this.age = new SimpleIntegerProperty(age);
        this.region = region;
    }
}

package test;

import javafx.beans.property.SimpleStringProperty;

public class Region {
    private SimpleStringProperty name;

    public Region(String regionName) {
        this.name = new SimpleStringProperty(regionName);
    }

    public String getName() {
        return this.name.getValue();
    }
}

package test;

        import javafx.collections.FXCollections;
        import javafx.collections.ObservableList;

public class Organization {
    private ObservableList<Student> students = FXCollections.observableArrayList();

    public ObservableList<Student> getStudents() {
        return this.students;
    }

    public ObservableList<Student> getStudentFromRegion(Region region) {
        // Здесь сложности
    }

    public Student createStudent(String surname, String name, Integer age, Region region) {
        Student student = new Student(surname, name, age, region);
        this.students.add(student);
        return student;
    }
}


Вопрос в процедуре getStudentFromRegion. Как отфильтровать только те записи из списка, которые принадлежат к определенному региону?
PM MAIL   Вверх
Samotnik
Дата 3.1.2016, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



Вариантов масса, один из
Код

public class Organization {
    private ObservableList<Student> students = FXCollections.observableArrayList();

    public ObservableList<Student> getStudents() {
        return this.students;
    }

    public ObservableList<Student> getStudentFromRegion(Region region) {
        ObservableList<Student> findedStudents = FXCollections.observableArrayList();
        for (Student student : students) {
            if (student.getRegion().equals(region)) {
                findedStudents.add(student);
            }
        }
        return findedStudents;
    }

    public Student createStudent(String surname, String name, Integer age, Region region) {
        Student student = new Student(surname, name, age, region);
        this.students.add(student);
        return student;
    }
}


Код

public class Region {
    private SimpleStringProperty name;
    public Region(String regionName) {
        this.name = new SimpleStringProperty(regionName);
    }
    public String getName() {
        return this.name.getValue();
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Region region = (Region) o;

        return !(name != null ? !name.equals(region.name) : region.name != null);

    }

    @Override
    public int hashCode() {
        return name != null ? name.hashCode() : 0;
    }
}



Код

public class Student {
    private SimpleIntegerProperty age;
    private SimpleStringProperty surname;
    private SimpleStringProperty name;
    private Region region;

    public Student(String surname, String name, Integer age, Region region) {
        this.surname = new SimpleStringProperty(surname);
        this.name = new SimpleStringProperty(name);
        this.age = new SimpleIntegerProperty(age);
        this.region = region;
    }

    public int getAge() {
        return age.get();
    }

    public void setAge(int age) {
        this.age.set(age);
    }

    public SimpleIntegerProperty ageProperty() {
        return age;
    }

    public String getSurname() {
        return surname.get();
    }

    public void setSurname(String surname) {
        this.surname.set(surname);
    }

    public SimpleStringProperty surnameProperty() {
        return surname;
    }

    public String getName() {
        return name.get();
    }

    public void setName(String name) {
        this.name.set(name);
    }

    public SimpleStringProperty nameProperty() {
        return name;
    }

    public Region getRegion() {
        return region;
    }

    public void setRegion(Region region) {
        this.region = region;
    }
}


Это сообщение отредактировал(а) Samotnik - 3.1.2016, 22:38
PM MAIL   Вверх
Elfix
Дата 4.1.2016, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 13.7.2005

Репутация: нет
Всего: нет



Спасибо!

Код

public ObservableList<Student> getStudentFromRegion(Region region) {
        ObservableList<Student> findedStudents = FXCollections.observableArrayList();
        for (Student student : students) {
            if (student.getRegion().equals(region)) {
                findedStudents.add(student);
            }
        }
        return findedStudents;
    }

Мне кажется данный способ несколько не оптимальным. И это первое, что реализовал я в своем тестовом примере: по сути создаю новый объект и в него по очереди добавляю элементы.
Можно ли в Java как-то более изящно решить эту задачу? Я нагуглил Stream и метод filter. Но я в упор не понимаю как работает этот механизм, так как совершенно не разбираюсь в лямбдах.
Буду рад, если решите мою задачу через stream и дадите подробные разъяснения как это работает smile
PM MAIL   Вверх
Samotnik
Дата 5.1.2016, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



набросал на коленке, но не тестил
Код

public class Organization {
    private ObservableList<Student> students = FXCollections.observableArrayList();
    private FilteredList<Student> filteredList = new FilteredList<>(students);

    public ObservableList<Student> getStudents() {
        return this.students;
    }

    public ObservableList<Student> getStudentFromRegion(Region region) {
        filteredList.setPredicate(student -> student.getRegion().equals(region));
        return filteredList;
    }

    public Student createStudent(String surname, String name, Integer age, Region region) {
        Student student = new Student(surname, name, age, region);
        this.students.add(student);
        return student;
    }
}


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.4539 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.