如何在一个方法中过滤一个或多个属性?

时间:2015-10-24 12:12:20

标签: java

我有Student班(String nameString DOBint ageint grade),然后我创建了ArrayList<Student>并添加了一些新的Student到列表中。

我想过滤该列表,只使用一种方法,但可以按名称,按DOB,按名称和DOB及年龄进行过滤,您就明白了。我尝试了重载,但我无法处理String - String和int - int。

有人能告诉我摆脱这个问题的方法吗?

public void filter(int age) {
    for (Student x : this.arraylist) {
        if (x.getAge() == age) {
            System.out.println(x.getName());
        }
    }
}


public void filter(int grade) {
    for (Student x : this.arraylist) {
        if (x.getGrade() == grade) {
            System.out.println(x.getName());
        }
    }
}

如果我写filterByAge(int age)filterByGrade(int age),一切都会好的,但我想重载方法过滤器......

2 个答案:

答案 0 :(得分:2)

您可以创建一个Filter界面,只需要一个{Filter}作为参数的filter函数。

interface Filter {
    boolean filter(Student x);
}

Student课程中,您可以

public void filter(Filter f) {
    for (Student x : this.arraylist) {
        if (f.filter(x)) {
            System.out.println(x.getName());
        }
    }
}

然后,您可以致电

filter(new Filter() {
    @Override
    boolean filter(Student x) {
        return x.getAge() == 30;
    }
});

或者

filter(new Filter() {
    @Override
    boolean filter(Student x) {
        return x.getGrade() == 5;
    }
});

我确信使用新的Java 8 lambda,你可以获得更简单的格式,更容易编码和更容易阅读,但我还不熟悉那些。

答案 1 :(得分:0)

不可能以你想要的方式重载函数,因为它们都传入了一个int,Java无法确定你想要使用哪一个。

例如,您可以确定此处使用的功能:

filter(30);

您需要更改功能名称才能完成此操作。

编辑:

我的另一个想法是你可以添加一个标志来确定你想要排序的东西。

例如:

public enum FilterType {
    AGE, GRADE
}

public void filter(int value, FilterType type) {
    switch (type) {
    case FilterType.AGE:
        for (Student x : this.arraylist) {
            if (x.getAge() == age) {
                System.out.println(x.getName());
            }
        }
        break;
    case FilterType.GRADE:
        for (Student x : this.arraylist) {
            if (x.getGrade() == grade) {
                System.out.println(x.getName());
            }
        }
        break;
    }
}