2013-04-18 5 views
1

Как отсортировать массив строк для двоичного поиска. Ниже я всегда получаю минус для моего индекса вместо правильного индекса. Пожалуйста помоги? Если слово не находится в массиве -1, должно быть возвращено.Бинарный поиск строковых массивов

public static int binary (String [] theword, String a) { 
    int index = -1; 
     Arrays.sort(theword); 
     Arrays.toString(theword); 
     index = Arrays.binarySearch(theword, a); 
    return index; 

} 
+2

Проверен код, и он возвращает правильный результат для моих тестовых данных. Можете ли вы поделиться тем, что вы передаете? – prashant

+0

@prashant Я читаю в файле, а затем ищем слово. Я ищу его слово «to», и он возвращается обратно -11 вместо 11 – user2291022

+1

вы можете изменить свой код для вывода содержимого массива и 'a', а затем опубликовать вывод здесь –

ответ

3

Он работает, смотрите ниже

public static void main(String... args) { 

    String words[] = { "abc3", "abc2", "abc1", "abc4" }; 

    Arrays.sort(words); 
    System.out.println(Arrays.toString(words)); 
    { 
     String word = "abc3"; 
     int index = Arrays.binarySearch(words, word); 
     index = index >= 0 ? index : -1; 
     System.out.println(word + " = " + index); 
    } 
    { 
     String word = "abc11"; 
     int index = Arrays.binarySearch(words, word); 
     index = index >= 0 ? index : -1; 
     System.out.println(word + " = " + index); 
    } 
} 

Выход

[abc1, abc2, abc3, abc4] 
abc3 = 2 
abc11 = -1 

Вы возвращаетесь индекс из отсортированного массива в то время как вам нужно индекс из исходного массива.

1

В документации говорится, что возвращаемое значение для Arrays.binarySearch() выглядит следующим образом:

Возвраты:
индекс ключа поиска, если оно содержится в массиве; в противном случае (- (точка ввода) - 1). Точка вставки определяется как точка, в которую ключ будет вставлен в массив: индекс первого элемента, который больше ключа, или a.length, если все элементы в массиве меньше указанного ключа. Обратите внимание, что это гарантирует, что возвращаемое значение будет> = 0 тогда и только тогда, когда будет найден ключ .

Таким образом, ваше слово «до» не найдено бинарным поиском. Более того, если бы он существовал, это было бы в 10-м индексе этого массива. Как -(10) -1 == -11

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

1

Общей ошибкой, которую я видел, является пространство, добавляемое к рассматриваемому слову. Применяйте функцию trim() для каждого слова перед добавлением в массив.

+0

Да, я тоже думал об этом. Не знаю точно, если мы не увидим больше кода/вывода. – iamnotmaynard

+0

@prashant это проблема, но как применить ее к методу выше. Я использовал обрезку, когда я хранил их в массиве, но он не работает, когда он передается в метод. – user2291022

+0

Личный линейный поиск находит 'to'? Я сомневаюсь, что если официальный метод двоичного поиска java не сможет его найти. Вам нужно только обрезать вещи один раз. Обрезка перед помещением в массив - это все, что вам нужно сделать. – Sanchit

Смежные вопросы