Поиск в массиве с пользовательским компаратором в Java - PullRequest
0 голосов
/ 16 января 2012

Почему он всегда возвращает 49999 независимо от того, что содержит strToSearch переменная? Даже с переменной поиска clank он возвращает то же самое. Я что-то пропустил:

    String[] arr = new String[100000];
    String strToSearch = "12";
    for (int i = 0; i < arr.length; i++) {
        arr[i] = i+","+i;
    }
    Arrays.sort(arr, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            if(o1 != null && o2 != null && !o1.isEmpty() && !o2.isEmpty() && o1.indexOf(",") != -1 && o2.indexOf(",") != -1) {
                String[] o1Arr = o1.split(",");
                String[] o2Arr = o2.split(",");
                Integer one = Integer.parseInt(o1Arr[0]);
                Integer two = Integer.parseInt(o2Arr[0]);
                return one.compareTo(two);
            }
            return 0;
        }
    });
    System.out.println(Arrays.binarySearch(arr, strToSearch, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            if(o1 != null && o2 != null && !o1.isEmpty() && !o2.isEmpty() && o1.indexOf(",") != -1 && o2.indexOf(",") != -1) {
                String[] o1Arr = o1.split(",");
                String[] o2Arr = o2.split(",");
                return o1Arr[0].compareTo(o2Arr[0]);
            }
            return 0;
        }
    }));

Мой массив содержит значения, разделенные запятыми, и я хочу искать по строке перед запятой в элементах массива. Есть ли другое простое решение? Я также создал пользовательский метод, который перебирает массив и находит строку, но я ищу некоторые альтернативы.

Ответы [ 4 ]

3 голосов
/ 16 января 2012

JavaDoc в Arrays.binarySearch(...) утверждает, что массив уже должен быть отсортирован, и, таким образом, компаратор фактически сравнивает значение массива и строку поиска, и не не используется для повторной сортировки массива.

Это означает, что вы получите что-то вроде compare(arr[x], "12"), и ваше условие if гласит, что обе строки должны содержать запятую, в противном случае они равны.И "12" не содержит запятых, поэтому "12" равен каждому элементу в массиве (всегда возвращает 0).

Edit :

Глядя на исходный код, кажется, поддерживает мое предположение.Вот такая строка, например:

 //c is the Comparator
 //midVal is an element of your array 
 //key is the key parameter you passed to binarySearch(...)
 c.compare(midVal, key); 

Причиной возврата 49999 является то, что первое значение mid имеет индекс mid = (low + high) >> 1, равный (0 + 99999) >> 1 == 49999, а компаратор возвращает 0, значения равнысчитается равным.И бум, значение "найдено".

1 голос
/ 16 января 2012

В вашем втором утверждении if: так как ваши strToSearch = "12" и не содержат ",",

o2.indexOf(",") != -1

всегда будет возвращать false.

Удалите отверстие if -Statement или хотя бы последнюю часть и все работает.

0 голосов
/ 16 января 2012

Вы предполагаете, что String strToSearch имеет тип "12,12".Чтобы этот код работал, просто измените strToSearch

Например:

Arrays.binarySearch(arr, "12,12", new Comparator<String>)
0 голосов
/ 16 января 2012

Проблема в методе сравнения вашего бинарного поиска.Это должно быть переписано так:

System.out.println(Arrays.binarySearch(arr, strToSearch, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        if(o1 != null && o2 != null && !o1.isEmpty() && !o2.isEmpty() && o1.indexOf(",") != -1) {
            String[] o1Arr = o1.split(",");
            int i1 = Integer.parseInt(o2);
            int i2 = Integer.parseInt(o1Arr[0]);
            return i2-i1;
        }
        return 0;
    }
}));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...