2015-07-13 2 views
2

У меня есть общий двоичный поиск, который правильно функционирует для Integers в Array. Однако, когда применяется к Array от Strings, он вернется только к трем из индексов правильно ([1], [2], [3]), отмечая остальные как несуществующие ([-1]). Заранее благодарим за понимание.Общий двоичный поиск с использованием строки

public class BinarySearch { 

private BinarySearch() { } 

private static <T extends Comparable<? super T>> int search(T[] list, int first, int last, T key){ 
    int foundPosition; 
    int mid = first + (last - first)/2; 
    if (first > last) 
     foundPosition = -1; 
    else if (key.equals(list[mid])) 
     foundPosition = mid; 
    else if (key.compareTo(list[mid]) < 0) 
     foundPosition = search(list, first, mid - 1, key); 
    else 
     foundPosition = search(list, mid + 1, last, key); 
    return foundPosition; 
} 

public static void main(String args[]) { 
    //Integer 
    Integer [] searchInteger = {0,2,4,6,8,10,12,14,16}; 
    int integerLast = searchInteger.length-1; 
    System.out.println("Integer test array contains..."); 
     for (Integer a1 : searchInteger) { 
     System.out.print(a1 + " "); 
     } 
    System.out.println("\nChecking Integer array..."); 
    int result; 
    for (int key = -4; key < 18; key++) { 
     result = BinarySearch.search(searchInteger, 0, integerLast, key); 
     if (result < 0) 
      System.out.println(key + " is not in the array."); 
     else 
      System.out.println(key + " is at index " + result + "."); 
     } 
    //String 
    String[] searchFruits = {"lemon", "apple", "banana", "peach", "pineapple", "grapes", "blueberry", "papaya"};  
    System.out.println("String test array contains..."); 
    for (String a1 : searchFruits) { 
     System.out.print(a1 + " "); 
    } 
    System.out.println("\nChecking String array..."); 
    int results; 
    int fruitLast = searchFruits.length-1; 
    for (int key = 0; key < searchFruits.length; key++){ 
     results = BinarySearch.search(searchFruits, 0, fruitLast, searchFruits[key]); 
     System.out.println("Key = " + searchFruits[key]); 
     System.out.println("Index result = " + results); 
     if (results < 0) 
      System.out.println(searchFruits[key] + " is not in the array."); 
     else 
      System.out.println(searchFruits[key] + " is at index " + results + ".");   
    } 
} 
} 

ответ

2

Поскольку ваша строка массива

String[] searchFruits = {"lemon", "apple", "banana", "peach", "pineapple", "grapes", "blueberry", "papaya"}; 

является не сортируется, где в качестве целого массива

Integer [] searchInteger = {0,2,4,6,8,10,12,14,16}; 

является отсортирован.

Кстати, вы могли бы использовать Arrays.binarySearch() тоже.

+0

А, спасибо! – Austin