Как найти элемент, который меньше, чем другой элемент? - PullRequest
0 голосов
/ 17 марта 2011

Я пытаюсь настроить программу бинарного поиска, которая использует строки вместо целых чисел. Проблема в том, что я не знаю, как сделать массив чисел, который меньше строкового значения.

Например

строковый массив меньше строкового значения.

/**
   The StringBinarySearcher class provides a public static
   method for performing a binary search on an String array.
*/



public class StringBinarySearcher
{
   /**
      The search method performs a binary search on an String
      array. The array is searched for the number passed to
      value. If the number is found, its array subscript is
      returned. Otherwise, -1 is returned indicating the
      value was not found in the array.
      @param numbers The array to search.
      @param value The value to search for.
   */



   public static int search(String[] numbers, String value)
   {
      int first;       // First array element
      int last;        // Last array element
      int middle;      // Mid point of search
      int position;    // Position of search value
      boolean found;   // Flag

      // Set the inital values.
      first = 0;
      last = numbers.length - 1;
      position = -1;
      found = false;

      // Search for the value.
      while (!found && first <= last)
      {
         // Calculate mid point
         middle = (first + last) / 2;

         // If value is found at midpoint...
         if (numbers[middle] == value)
         {
            found = true;
            position = middle;
         }

         // else if value is in lower half...
         // needs array to be less then the string value?, without using equality regulators
         else if (numbers[middle].compareTo(numbers[middle +1]) > 0)
            last = middle - 1;
         // else if value is in upper half....
         else
            first = middle + 1;
      }

      // Return the position of the item, or -1
      // if it was not found.
      return position;
   }
}

Ответы [ 3 ]

2 голосов
/ 17 марта 2011

Ваша проблема в операторе сравнения (==).Оператор сравнения хорошо определен только для примитивных типов данных в Java.String - это класс (не примитивный тип данных).Поэтому вам нужно будет использовать метод String equals(String) для их сравнения.

Если вы хотите сравнить их как числа, то вам нужно будет проанализировать их в целые числа.Для этого вы можете использовать Integer.parseInt(String), а затем сравнить целые числа.

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

Первое сравнение:

if (numbers[middle] == value)

следует , а не использовать оператор ==. Помните, что вы сравниваете объекты String. Вам следует либо использовать метод equals, либо compareTo.

Следующее сравнение у вас есть:

// else if value is in lower half...
// needs array to be less then the string value?, without using equality regulators
else if (numbers[middle].compareTo(numbers[middle +1]) > 0)

Согласно вашим комментариям вы проверяете, находится ли value в нижней половине массива, но ваш код сравнивает элемент массива со следующим элементом массива. Для соответствия комментариям это должно быть:

else if (value.compareTo(numbers[middle]) < 0)

Также обратите внимание, что при сравнении строк, представляющих числа, которые вы делаете, вы получите странные результаты. Метод compareTo сравнивает строки лексикографически. Это означает, например, что «5» будет оцениваться как больше, чем «11».

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

Это прекрасно работает для примитивного типа данных.Не для объектов String.

== используется для проверки того, являются ли ссылки на два объекта одинаковыми или нет.«==» никогда не сравнивает содержимое двух объектов.

String strName1 = "Me";
String strName2 = new String("Me");

strName1 == strName2 - ложь.Поскольку они ссылаются на два разных объекта.

Для сравнения можно использовать метод equals.

if (strName2 .equals(strName2 )) {
    System.out.println("Me and Me are same :P");
}
...