binarySearch
принимает ключ для поиска, имеющий тип класса объектов в списке,
public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c)
Итак, передайте City
объект в binarySearch
,
for (int i = 0; i < list.size(); i++) {
int index = Collections.binarySearch(list, new City(sub), comparator);
if (index >= 0)
result.add(i);
}
Также, если вы используете java8 +, вы можете использовать лямбду для Comparator
,
Comparator<City> comparator = (node1, node2) -> {
boolean node1Contains = node1.getCityName().contains(sub);
boolean node2Contains = node2.getCityName().contains(sub);
if (node1Contains && !node2Contains) {
return 1;
} else if (!node1Contains && node2Contains ) {
return -1;
} else {
return 0;
}
};
Обновление: для сортировки по весу в случае совпадения вам нужно использовать Integer.compare(node2.getCityWeight(), node1.getCityWeight())
,
Также вы не можете binarySearch
с таким же компаратором, поскольку вы не знаете вес города, который вы ищете. Вы можете использовать Stream,
public static Integer[] searchBySubStringCharacter(List<City> list, String sub) {
List<Integer> result = new ArrayList<>();
Comparator<City> comparator = (node1, node2) -> {
boolean node1Contains = node1.getCityName().contains(sub);
boolean node2Contains = node2.getCityName().contains(sub);
if (node1Contains && !node2Contains) {
return 1;
} else if (!node1Contains && node2Contains ) {
return -1;
} else {
return Integer.compare(node2.getCityWeight(), node1.getCityWeight());
}
};
Collections.sort(list, comparator);
return IntStream.rangeClosed(0, list.size() - 1)
.filter(i -> list.get(i).getCityName().contains(sub))
.boxed()
.toArray(Integer[]::new);
}