2016-05-23 4 views
2

Der Name eines Romans und sein zugewiesener Ganzzahlcode werden in einem sortierten Array gespeichert, so dass jeder gerade Index (einschließlich 0) einen Code enthält und jeder ungerade Index einen Titel enthält:BinarySearch kann bestimmte Elemente in String nicht finden []

[1, Tom Sawyer, 2, Black Beauty, 3, Treasure Island]

Derzeit habe ich eine Binary Methode implementiert, die einen vom Benutzer eingegebenen Code nimmt und gibt den entsprechenden Titel, wenn Es existiert. Es funktioniert, es sei denn, die Benutzereingaben:

  • 100 (letzter Code in dem Array)
  • 2, 6 oder 10; aber arbeitet für 1

    public static String binarySearch(String [] bookList, int left, int right, String code) 
    { 
    
    /* bookList - sorted array 
    * left - leftmost index 
    * right - rightmost index 
    * code - item to look for 
    */ 
    
    int middle; 
    
    if (left > right) { 
        return "left>right"; 
    } 
    
    middle = (left + right)/2; 
    /*set middle to nearest even offset (all # are in even position)*/ 
    middle += middle & 1; 
    
    if (bookList[middle].equals(code)) { 
         return bookList[middle + 1]; 
    } 
    
    if (code.compareTo(bookList[middle]) < 0) { 
        return binarySearch(bookList, left, middle - 1, code); 
    } 
    
    return binarySearch(bookList, middle + 2, right, code);   
    } 
    

Der gesamte Inhalt des Arrays here

+0

Warum vergleichen Sie die 'code' (die Zahl ist) als' String'? Was passiert, wenn Sie "2" und "11" vergleichen? Wandle es in "int" um und vergleiche es dann. – TDG

+0

Die lexikographische Reihenfolge der Zahlen als Strings ist - 1,10,11,12, ..., 19, 100, 2, 20, 21 ... Wenn Sie also Ihre Codes als Strings behandeln, wird das Array nicht sortiert. – TDG

+0

@TDG Ich würde gerne Ihren Kommentar als Antwort auf meine unintelligente Frage akzeptieren. –

Antwort

0

Das Problem zu finden ist, dass Ihre Codes sind Strings, die Zahlen darstellen. Da Sie sie als Strings vergleichen, ist die lexikographische Reihenfolge 1, 10, 11, 12, ..., 19, 100, 2, 20, 21 ... also ist das Array nicht so sortiert, wie Sie vielleicht denken.
Was sollten Sie tun, ist, den Code als int analysieren -

int bookCode = Integer.parseInt(code); 

und dann vergleichen -

if Integer.parseIntbookList[middle] < bookCode 
//do something 
Verwandte Themen