我有Student
班(String name
,String DOB
,int age
和int 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)
,一切都会好的,但我想重载方法过滤器......
答案 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;
}
}