Das sollte funktionieren:
Comparator<String> startsWithComparator = new Comparator<String>() {
public int compare(String currentItem, String key) {
if(currentItem.startsWith(key)) {
return 0;
}
return currentItem.compareTo(key);
}
};
int index = Collections.binarySearch(items, "contact.", startsWithComparator);
Das Sortieren und anschließende binäre Suchen ist jedoch weniger effizient als die Iteration in einem Durchgang.
Nachtrag:
Auch wenn die obige Antwort Ihnen hilft, hier ist ein anderer Weg (inspiriert von Scala, Google Collections) :
List<String> items = Arrays.asList("one", "two", "three", "four", "five", "six");
int index = find(items, startsWithPredicate("th"));
System.out.println(index);
public static Predicate<String> startsWithPredicate(final String key) {
return new Predicate<String>(){
@Override
public boolean apply(String item) {
return item.startsWith(key);
}
};
}
public static <T> int find(Collection<T> items, Predicate<T> predicate) {
int index = 0;
for(T item: items) {
if(predicate.apply(item)) {
return index;
}
index++;
}
return -1;
}
interface Predicate<T> {
boolean apply(T item);
}
Hier ist die find()-Methode nicht mit Ihrer "passenden" Logik verbunden; sie findet einfach ein Element, das das Prädikat erfüllt. Sie können also eine andere Implementierung des Prädikats an die find()-Methode übergeben, die z.B. 'endsWith' prüfen kann und das gefundene Element zurückgibt, das mit einer bestimmten Zeichenkette endet. Außerdem funktioniert die find()-Methode für jede Art von Sammlung; alles, was sie braucht, ist ein Prädikat, das ein Element vom Typ Sammlungselement in einen Boolean umwandelt. Diese vielen Codezeilen um eine einfache Logik herum zeigen auch die mangelnde Unterstützung von Java für Funktionen erster Klasse.