См. @Oxbow_lakes выше - я думаю, что вам нужно не передавать String
как whatSearch
, это передать небольшой фрагмент кода, который знает, как получить интересующее вас свойство. менее общая версия:
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;
}
О, и вы можете испытать желание использовать отражение. Не. :)