2016-05-23 6 views
0

Also ich bin zwei Funktionen von der sequenziellen Suche auf binäre Suche neu schreiben. Ich verstehe den Unterschied in der Effizienz zwischen den beiden, aber ich habe Probleme mit der Syntax beim Ändern sie in Binär.Verwenden der binären Suchmethode, um den Index eines Elements zu finden

Klasse

public class SortedList<Item extends Comparable<Item>> implements SortedList<Item> { 

    private Object[] data = new Object[5]; 

    private int size = 0; 

    public int size() { 
     return size; 
    } 

    public boolean isEmpty() { 
     return size == 0; 
    } 

    public boolean equals(Object o) { 
     SortedList<Item> lst = (SortedList<Item>) o; 
     if (size != lst.size) 
      return false; 
     Iterator<Item> i1 = lst.iterator(); 
     Iterator<Item> i2 = iterator(); 
     while (i1.hasNext()) { 
      Item x1 = i1.next(); 
      Item x2 = i2.next(); 
      if (!x1.equals(x2)) 
       return false; 
     } 
     return true; 
    } 

    //METHOD TO CHANGE TO BINARY-SEARCH 
    public int indexOf(Item x) { 
     int low = 0, high = size - 1; 
     while (low <= high) { 
      int mid = (low + high)/2; 
      if ((int) x == mid) 
       return mid; 
      else if ((int) x > mid) 
       high = mid - 1; 
      else 
       low = mid + 1; 
     } 
     return -1; 
    } 

Haupt

public class Main { 

    public static void main(String[] args) { 

     SortedList<Integer> s = new SortedList<Integer>(); 

     s.add(5); 
     s.add(6); 
     s.add(7); 
     s.add(8); 
     s.add(9); 
     s.add(10); 

     System.out.println(s.indexOf(6)); //-1 

    } 
} 

Grundsätzlich Ich habe Probleme bei der Item x mit ganzen Zahlen zu vergleichen. Es scheint, dass selbst wenn ich x zu und Int-1 die Funktion zurückgibt. Was ist der richtige Weg für mich, um in dieser Funktion zu vergleichen? Ich kann bei Bedarf auch mehr Code zur Verfügung stellen, ich habe alles miteinbezogen, was ich für relevant hielt.

+0

'if ((int) x == Mitte)': Wie würde das funktionieren, wenn "Item" war etwas anderes als "Integer"? –

Antwort

3

Sie verwirren den Index und das Element in der Liste:

if ((int) x == mid) 

Sie wollen:

if(x.equals(itemAtIndex(mid))) 
+0

Ahh, wusste, es wäre etwas Einfaches, Danke! – 23k

+1

Ich nehme an, für die anderen Anweisungen würde ich die 'compareTo()' Methode verwenden? – 23k

+0

Genau! Deshalb brauchen Sie Ihre Objekte, um vergleichbar zu sein. –

Verwandte Themen