我在子字符串中实现二进制搜索时遇到问题。在我的City对象中,有一个cityName变量,定义为String。我想输入“ Sha”之类的任何子字符串,它显示“ Sha”的结果。除此之外,还有一个权重变量可对降落的城市名称进行排序。例如,较大的权重值在顶部,并且排序过程基于降序。
我该怎么做?如何将其添加到comparater
区域?
这里是我的城市对象
public class City implements Serializable{
private Integer cityWeight;
private String cityName;
}
下面是我的代码段。
public static Integer[] searchBySubStringCharacter(List<City> list, String sub) {
List<Integer> result = new ArrayList<>();
Comparator<City> comparator = new Comparator<City>() {
public int compare(City node1, City 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;
}
}
};
Collections.sort(list, comparator);
for (int i = 0; i < list.size(); i++) {
int index = Collections.binarySearch(list, new City(sub), comparator);
if (index >= 0)
result.add(i);
}
return result.stream().toArray(Integer[]::new);
}
[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 +,则可以将lambda用于
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;
}
};
[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 +,则可以将lambda用于
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;
}
};