Это должно работать:
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);
Однако сортировка и последующий двоичный поиск менее эффективны, чем однопроходная итерация.
Добавление:
Хотя приведенный выше ответ поможет вам, вот другой способ (вдохновленный 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);
}
Здесь дело в том, что метод find () не связан с вашей логикой «соответствия»;он просто находит элемент, который удовлетворяет предикату.Таким образом, вы можете передать другую реализацию предиката, например.который может проверять метод 'setsWith' для метода find (), и он будет возвращать найденный элемент, который заканчивается конкретной строкой.Далее метод find () работает для любого типа коллекции;все, что ему нужно - это предикат, который преобразует элемент типа элемента коллекции в логическое значение.Это множество строк кода вокруг простой логики также показывает отсутствие поддержки Java для функций первого класса.