参见上面的@oxbow_lakes——我认为你想要的不是将String 传递为whatSearch,而是传递一些知道如何获取你感兴趣的属性的sn-p 代码. 对于不太通用的版本:
public static interface PlaneMatcher {
boolean matches(Plane plane, String query);
}
public int search(PlaneMatcher matcher, String query){
int place = -1;
boolean found = false;
for ( Iterator<Plane> iteraPlane = this.planes.iterator(); iteraPlane.hasNext() && found == false; ) {
Plane temp = (Plane) iteraPlane.next();
if (matcher.matches(temp, query) {
found = true;
}
place++;
}
return place;
}
...
// example
int pilotNameIndex = search(new PlaneMatcher() {
boolean matches(Plane plane, String query) {
// note: assumes query non-null; you probably want to check that earlier
return query.equals(plane.getPilotName());
}
}, "Orville Wright");
(顺便说一句,如果它是您感兴趣的索引而不是 Plane 本身,我不会打扰 Iterator —— 只需使用老式的 for (int i = 0; i < planes.size(); i++) 循环,当你有一个匹配,return i。)
现在,棘手的一点是,您必须搜索的内容是否真的在运行时由任意字符串标识。如果是这种情况,我可以提出两种选择:
- 不要将这些值存储为对象字段 --
plane.pilotName、plane.destination -- 完全不。只要有一个Map<String, String>(或者更好的是Map<Field, String>,其中Field 是所有有效字段中的Enum)称为plane.metadata。
- 将它们存储为对象字段,但如上所述预先填充从字段名称到
PlaneMatcher 实例的映射。
例如:
private static final Map<String, PlaneMatcher> MATCHERS = Collections.unmodifiableMap(new HashMap<String, PlaneMatcher>() {{
put("pilotName", new PlaneMatcher() {
boolean matches(Plane plane, String query) {
return query.equals(plane.getPilotName());
});
...
put("destination", new PlaneMatcher() {
boolean matches(Plane plane, String query) {
return query.equals(plane.getDestination());
});
}}
...
public int search(String whatSearch, String query){
PlaneMatcher matcher = MATCHERS.get(whatSearch);
int place = -1;
boolean found = false;
for ( Iterator<Plane> iteraPlane = this.planes.iterator(); iteraPlane.hasNext() && found == false; ) {
Plane temp = (Plane) iteraPlane.next();
if (matcher.matches(temp, query) {
found = true;
}
place++;
}
return place;
}
哦,您可能很想使用反射。别。 :)