Две разные реализации

Я хочу сделать две разные реализации фильтра, который возвращает только тех студентов, которые набрали не менее 50% баллов. Моя проблема в том, как правильно реализовать оба метода, и, во-первых, я не понимаю, почему это не работает, и поэтому мне нужна ваша помощь для этого.

Класс фильтра с обеими реализациями:

package u7a1;

import java.util.ArrayList;

class Filter implements IFilter {
    public ArrayList filterRaw(ArrayList groups)
    {
        ArrayList<Boolean> allstudents = new ArrayList();
        ArrayList<Student> students = new ArrayList();
        ArrayList pass = new ArrayList();
        for (int i = 0; i < groups.size(); i++)
        {
            if ((Integer)groups.get(i) >= 50) allstudents.add(true);
            else allstudents.add(false);
        }
        for (int i = 0; i < groups.size(); ++i)
        {
            if ((Boolean)allstudents.get(i) == true) pass.add(groups.get(i));
        }
        return pass;
    }

    public ArrayList<Student> filterGeneric(ArrayList<ArrayList<Student>> groups)
    {
        ArrayList<Boolean> allstudents = new ArrayList();
        ArrayList<Student> students = new ArrayList();
        ArrayList pass = new ArrayList();
        /*for (int i = 0; i < groups.size(); i++)
        {
            Integer mystudentpoints = new Integer(0);
            mystudentpoints = Student.getPoints();
            if (Student.getPoints() >= 50) allstudents.add(true);
            else allstudents.add(false);
        }*/
        for (int i = 0; i < groups.size(); ++i)
        {
            if ((Boolean)allstudents.get(i) == true) pass.add(groups.get(i));
        }
        return pass;
    }
}

Завод фильтров уже правильный:

package u7a1;

/**
 * Factory for "Testat" filters 
 */
public class FilterFactory {
    /**
     * Create a "Testat" filter
     * @return a "Testat" filter
     */
    public static IFilter create()
    {
        // TODO
        return new Filter();
    }
}

Вот интерфейсы, которые реализованы классом, в котором методы работают некорректно:

package u7a1;

import java.util.ArrayList;

/**
 * Filters for students who obtain the "Testat".
 * 
 * The requirements for the testat are to have at least {@link IFilter#criteria} percent 
 * of {@link IFilter#maxNumberofPoints} points.
 */
public interface IFilter {
    public final int maxNumberofPoints = 80;
    public final double criteria = 50;

    /**
     * Filter all students that achieved enough points for the "Testat".
     * 
     * @param groups an ArrayList of groups, where a group is an ArrayList of students
     * @return the ArrayList of all students who achieved enough points for the "Testat".
     */
    public ArrayList filterRaw(ArrayList groups);

    /**
     * Filter all students that achieved enough points for the "Testat".
     * 
     * @param groups an ArrayList of groups, where a group is an ArrayList of students
     * @return the ArrayList of all students who achieved enough points for the "Testat".
     */
    public ArrayList<Student> filterGeneric(ArrayList<ArrayList<Student>> groups);
}

Больше я не редактирую основной класс:

/**
 * Main class of the Java program. 
 * 
 */
public class Main {
    public static void main(String[] args) {
        System.out.println("-- Array-Listen und Generics --");
        /* you can make function calls from here*/
    }
}

Наконец, у меня есть класс Student, который не нужно менять:

package u7a1;

public class Student {
    private String name;
    private int legi;
    private int points;

    public Student(String name, int legi)
    {
        this.name = name;
        this.legi = legi;
        points = 0;
    }

    public int getLegi()
    {
        return this.legi;
    }

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

    public Student setPoints(int points)
    {
        this.points = points;
        return this;
    }

    public int getPoints()
    {
        return points;
    }

    public String toString()
    {
        return String.format("%s (%d)", name, legi);
    }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
76
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ядро вашего проекта - это Main.class, там есть все, что будет выполняться. Остальные классы только объявляются, но никогда не используются. Когда вы запускаете программу, она запускает строки с командами в основном методе. В настоящее время единственное, что у вас есть, - это вывод на консоль String с текстом: «- Array-Listen und Generics -»

Теперь вам нужно подготовить некоторые данные, которые вы будете фильтровать, например

Student student1 = new Student("John", 1);
student1.setPoints(51);
Student student2 = new Student("Alice", 2);
student1.setPoints(48);

List<Student> studentList = new ArrayList<>();
studentList.add(student1, student2);

Допустим, у вас есть тестовые данные, теперь вам нужно использовать свой фильтр. Чтобы использовать ваш фильтр, нам нужно использовать его реализацию

IFilter myFilter = FilterFactory.create();

Теперь myFilter - это экземпляр вашей реализации, чтобы использовать его, вам нужно вызвать метод с объявленными данными.

List<Student> result = myFilter.filterRaw(studentList);

И пример реализации этого метода будет

public List<Student> filteredStudents(List<Student> input) {
    return input.stream().filter(s -> s.getPoints() > 50).collect(Collectors.toList());
}

Но вы можете заметить, что необходимо изменить объявление интерфейса, чтобы он имел те же типы.

Ответ принят как подходящий

реализовать 2 типа фильтрации строк вам поможет шаблон разработки стратегии это хорошая статья http://www.oodesign.com/strategy-pattern.html и я думаю, вам нужно поменять наполнитель, как

  public ArrayList filterRaw(ArrayList groups)
{
    ArrayList pass = new ArrayList();
    for (int i = 0; i < groups.size(); i++)
    {
        if ((Integer)groups.get(i) >= 50) pass.add(groups.get(i));

    }
    return pass;
}

Другие вопросы по теме