Java 如何通过二进制搜索搜索ArrayList中的任何值

Java 如何通过二进制搜索搜索ArrayList中的任何值,java,binary-search,Java,Binary Search,我在获取包含许多索引的列表时遇到了一个问题,这是获取键值的结果。我的代码中有一个错误 我的城市班如下所示 public class City implements Serializable{ private String cityName; private String countryName; ... } Shanghai, China ... ... Scanner scanner = new Scanner(System.in); System.out.prin

我在获取包含许多索引的列表时遇到了一个问题,这是获取键值的结果。我的代码中有一个错误

我的城市班如下所示

public class City implements Serializable{
    private String cityName;
    private String countryName;
    ...
}
Shanghai, China
...
...
Scanner scanner = new Scanner(System.in);
System.out.print("Enter the word of character which I want to search : ");
String charWord = scanner.nextLine();
System.out.println("Search " + charWord);
Integer[] index = BinarySearch.binarySearch(cities, charWord);
System.out.println(index.toString());


public static Integer[] binarySearch( ArrayList<City> list, String key ) {
        Comparable comp = (Comparable)key;
        List<Integer> arrlist = new ArrayList<Integer>();
        Integer arr[] = null;
        int res = -1, min = 0, max = list.size() - 1, pos;
        while( ( min <= max ) && ( res == -1 ) ) {
            pos = (min + max) / 2;
            int comparison = comp.compareTo(key.contains(list.get(pos).getCityName()));
            if( comparison == 0) {
                res = pos;
                arrlist.add(res);
            }
            else if( comparison < 0)
                max = pos - 1;
            else
                min = pos + 1;
        }

        return arrlist.toArray(arr);
    }
我的Arraylist包含城市名称及其国家名称,如下所示

public class City implements Serializable{
    private String cityName;
    private String countryName;
    ...
}
Shanghai, China
...
...
Scanner scanner = new Scanner(System.in);
System.out.print("Enter the word of character which I want to search : ");
String charWord = scanner.nextLine();
System.out.println("Search " + charWord);
Integer[] index = BinarySearch.binarySearch(cities, charWord);
System.out.println(index.toString());


public static Integer[] binarySearch( ArrayList<City> list, String key ) {
        Comparable comp = (Comparable)key;
        List<Integer> arrlist = new ArrayList<Integer>();
        Integer arr[] = null;
        int res = -1, min = 0, max = list.size() - 1, pos;
        while( ( min <= max ) && ( res == -1 ) ) {
            pos = (min + max) / 2;
            int comparison = comp.compareTo(key.contains(list.get(pos).getCityName()));
            if( comparison == 0) {
                res = pos;
                arrlist.add(res);
            }
            else if( comparison < 0)
                max = pos - 1;
            else
                min = pos + 1;
        }

        return arrlist.toArray(arr);
    }
由于Arraylist的大小非常大,比如50000,所以我使用二进制搜索来搜索列表中的任何字符或单词

我想搜索任何对大小写敏感的字符或单词,并检索它们的索引

我怎样才能完成这个过程

代码根据定义的字符、字符串或单词运行,如下所示

示例

Enter the word of character which I want to search : W
Enter the word of character which I want to search : Sha
Enter the word of character which I want to search : Shanghai
下面是我的代码片段,如下所示

public class City implements Serializable{
    private String cityName;
    private String countryName;
    ...
}
Shanghai, China
...
...
Scanner scanner = new Scanner(System.in);
System.out.print("Enter the word of character which I want to search : ");
String charWord = scanner.nextLine();
System.out.println("Search " + charWord);
Integer[] index = BinarySearch.binarySearch(cities, charWord);
System.out.println(index.toString());


public static Integer[] binarySearch( ArrayList<City> list, String key ) {
        Comparable comp = (Comparable)key;
        List<Integer> arrlist = new ArrayList<Integer>();
        Integer arr[] = null;
        int res = -1, min = 0, max = list.size() - 1, pos;
        while( ( min <= max ) && ( res == -1 ) ) {
            pos = (min + max) / 2;
            int comparison = comp.compareTo(key.contains(list.get(pos).getCityName()));
            if( comparison == 0) {
                res = pos;
                arrlist.add(res);
            }
            else if( comparison < 0)
                max = pos - 1;
            else
                min = pos + 1;
        }

        return arrlist.toArray(arr);
    }
Scanner Scanner=新的扫描仪(System.in);
System.out.print(“输入我要搜索的字符:”);
String charWord=scanner.nextLine();
System.out.println(“搜索”+charWord);
整数[]索引=BinarySearch.BinarySearch(城市,字符);
System.out.println(index.toString());
公共静态整数[]二进制搜索(ArrayList列表,字符串键){
可比comp=(可比)键;
List arrlist=new ArrayList();
整数arr[]=null;
int res=-1,min=0,max=list.size()-1,pos;

而((min这将使用城市名称进行搜索

    private static class City {

        private String country;
        private String cityName;

        public City(String cityName, String country) {
            this.cityName = cityName;
            this.country = country;
        }

        public void setCityName(String cityName) {
            this.cityName = cityName;
        }

        public String getCityName() {
            return cityName;
        }

        public String getCountry() {
            return country;
        }

        public void setCountry(String country) {
            this.country = country;
        }

        @Override
        public String toString() {
            return cityName;
        }
    }

    public static void main(String[] args) {
        List<City> list = new ArrayList<>();
        list.add(new City("Shanghai", "Shanghai"));
        list.add(new City("USA", "USA"));
        list.add(new City("China", "China"));
        list.add(new City("Germany", "Germany"));
        list.add(new City("China", "China"));
        list.add(new City("china", "china"));
        Integer[] indices = binarySearch(list, "China");
        for (int i = 0; i < indices.length; i++) {
            System.out.print(indices[i] + " ");
        }
        System.out.println();
    }

    public static Integer[] binarySearch(List<City> cities, Comparable key) {
        List<Integer> arrList = new ArrayList<Integer>();
        int lo = 0, hi = cities.size() - 1, mid;
        cities.sort((str1, str2) -> str1.getCityName().compareTo(str2.getCityName()));
        System.out.println(cities);
        while (lo <= hi) {
            mid = lo + (hi - lo) / 2;
            int cmp = key.compareTo(cities.get(mid).getCityName());
            if (cmp == 0) {
                arrList.add(mid);
                lo = mid + 1;
            } else if (cmp < 0)
                hi = mid - 1;
            else
                lo = mid + 1;
        }
        return arrList.stream().toArray(Integer[]::new);
    }

    private static Integer[] searchByCharacters(Integer[] indices, List<City> list, String sub) {
        List<Integer> result = new ArrayList<>();
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).getCityName().contains(sub))
                result.add(i);
        }
        return result.stream().toArray(Integer[]::new);
    }

这一行的作用是什么:
comp.compareTo(key.contains(list.get(pos.getCityName()))
mean?你是在寻找一个精确的匹配还是像Shanghai和Shangall这样的匹配百分比,例如?如果是后者,你需要进行一个最近的匹配,你需要编写一个单独的函数来比较两个字符串,并给你一个相等的度量。
包含
只告诉你一个字符串是否存在于另一个字符串中g、 另外,我相信像Trial Search Trie这样的数据结构在这种情况下也会更有效。@SomeDude我共享了示例输入。这就是为什么我使用contains方法,但它不起作用。输入我要搜索的字符:W:这是否意味着要获取所有以
W
开头的字符串?或者包含
W
?或以
W
结尾?在任何情况下,您似乎在寻找一组字符串中的前缀匹配,我相信trie更适合这些字符串。@SomeDude包含W。每个城市名称都以大写字母开头。因此它得到以W开头的城市名称。但我可以使用W(小写)。它得到包含w字母的城市名称。@SomeDude我如何重新排列这个二进制代码?我编辑我的帖子。它不仅适用于单词,也适用于字符或字符串。是的,任何包装类都有可比性,所以字符、整数等@TonyBrand你想搜索城市名称中的字符吗?确切地说,这段代码有效这两种情况都适用。但它不起作用。你的City类只有一个值。我的City类有两个值cityName和country。我再次编辑了我的帖子。