поиск строки в массиве - PullRequest
       24

поиск строки в массиве

1 голос
/ 02 марта 2011

Извините, если это повторение, но я искал ответ на этот вопрос, но я нигде не могу его найти, и мой последний вопрос касался того же кода, но с другой проблемой.

Мне нужно найти строку внутри массива, но все строки в массиве имеют длину 16 символов, а ключ поиска не будет 16 символов при вводе пользователем.До сих пор каждая попытка, которую я предпринял, заканчивалась тем, что строка не была найдена, хотя я знаю, что она находится в массиве.Я думаю, что это как-то связано с конечными пробелами после фактического строкового текста в массиве, но я не уверен, как с этим справиться.

Это мое поисковое заявление.Я отмечу, что мой оператор compareTo () сравнивает this.name с other.name, так что я совершенно сбит с толку .:

case 'b':
      System.out.println();
      System.out.println("Please enter a customer name:");

      String search = kb.nextLine(); //read the user's search
      int place; //location of result

      Arrays.sort(A);

      Customer searchCust = new Customer(search);

      place = Arrays.binarySearch(A,searchCust);

      if (place <= 0)
        System.out.println("Cannot find customer named " + search);
     else
     {
       System.out.println("Customer found:");  
       System.out.println(A[place-1]);
        break;


 public int compareTo(Customer a)
 {
  return this.name.compareTo(a.name);
 }   //end compareTo

Ответы [ 5 ]

1 голос
/ 02 марта 2011

Хорошо, если бинарный поиск невозможен (что, кажется, имеет место), мы можем просто реализовать простое пользовательское решение:

public Customer findCustomerByName(Customer[] array, String pattern){
    for(Customer candidate: array){
       if(candidate.getName().contains(pattern)){
          return candidate;
       }
    }
    return null;
}

Или я что-то пропустил?

1 голос
/ 02 марта 2011

Редактировать: после прояснения вопроса.

Итак, проблема в том, что ваши пользователи вводят что-то вроде

"Smith"
, но ваши элементы массива всегда дополняются длиной до 16 символови может иметь поисковый термин где-то посередине, например
"John Smith      "
, тогда я бы рекомендовал просто циклически проходить по массиву и делать .contains() для каждого элемента.

Бинарный поиск - это оптимизация, которую я бы рассмотрел толькоесли производительность оказывается проблемой, потому что она создает довольно много сложностей.

0 голосов
/ 02 марта 2011

Или вы делаете свой класс Customer implement Comparable (см. Comparable ).Затем вы реализуете int compareTo(Customer otherCustomer) внутри Customer, где вы возвращаете число <0, 0 или> 0, в зависимости от того, должно ли otherCustomer быть меньше, равно, больше this (текущий объект).

Как взято из Arrays.sort:

Все элементы в массиве должны реализовывать интерфейс Comparable.Кроме того, все элементы в массиве должны быть взаимно сопоставимы (то есть e1.compareTo (e2) не должно создавать исключение ClassCastException для любых элементов e1 и e2 в массиве).

0 голосов
/ 02 марта 2011

Мои заметки:

  1. Убедитесь, что Клиент правильно реализует естественный порядок (он же Comparable ) или;

  2. Используйте версию binarySearch, которая использует компаратор (http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html) и;

  3. Убедитесь, что ввод соответствует ожидаемому (например, он не содержит лишних символов новой строки и т. Д.) И;

  4. Убедитесь, что A имеет правильный тип - Customer[] в этом случае (объявление не дано). binarySort(string[], Customer) никогда не удастся. (Если использовать версию бинарной сортировки, которая использует Comparator, такое несоответствие не скомпилируется.)

Удачного кодирования.

0 голосов
/ 02 марта 2011

Если ваш ключ поиска отличается от значений массива, ваш бинарный поиск не найдет совпадение с помощью compareTo - если, как вы говорите, вы реализовали его для проверки простого равенства строк.

Есть другая реализацияДля двоичного поиска, который принимает пользовательский объект Comparator ...

public static int binarySearch(Object[] a,
                               Object key,
                               Comparator c)

Вы можете реализовать свой собственный пользовательский Comparator, чтобы сопоставить сокращенный ключ со значением массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...