这应该有效:
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() 方法与您的“匹配”逻辑无关;它只是找到一个满足谓词的元素。因此,您可以传递谓词的不同实现,例如。它可以检查 'endsWith' 到 find() 方法,它会返回以特定字符串结尾的找到的项目。此外 find() 方法适用于任何类型的集合;它所需要的只是一个谓词,它将集合元素类型的元素转换为布尔值。围绕一个简单逻辑的多行代码也表明 Java 缺乏对一流函数的支持。