Collections.binarySearch(LinkedList): cannot find method

  • Themenstarter Themenstarter Gelöschtes Mitglied 28785
  • Beginndatum Beginndatum
G

Gelöschtes Mitglied 28785

Gast
Hallo allerseits, ich handiere nun schon seit 2 Tagen mit meiner Collection (LinkedList) herum und habe es mitlerweile sogar soweit gebracht, dass der Compiler bei der Collections.sort -Funktion nicht mehr herummotzt ...

Leider bekomme ich jedoch die Fehlermeldung bei Collections.binarySearch() einfach nicht weg.
Es wäre wirklich toll, wenn ihr euch das mal ansehen könntet und mir einen Tip geben könntet :-/

Java:
import java.util.LinkedList;
import java.util.Iterator;
import java.util.Collections;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Comparator;

public class HalloBibliothek {

   public static void main(String[] args) {

   // Erzeugung eines Bibliothek-Objektes
    Bibliothek bibo = new Bibliothek();

   // Erzeugung von zwei Buch-Objekten
	Buch buch1 = new Buch("1000", "Dr. H.", "UML");
	Buch buch2 = new Buch("1001", "Mrs. L.", "Java2");

   // Nachricht an die Bibliothek, dass die Buecher aufgenommen werden sollen
	bibo.sortiertesEinfuegen(buch1);
	bibo.sortiertesEinfuegen(buch2);
	
	// Vorschau 1
	System.out.println("\nContent of LinkedList:\n");
	for( Iterator i = bibo.meineBuecher.iterator(); i.hasNext(); )
	System.out.println(i.next());
	
	// Liste sortieren
	Collections.sort (bibo.meineBuecher,new Vergleich());

    // Suche
    System.out.println("Searching for UML ...");
    int i2 = Collections.binarySearch(bibo.meineBuecher, "UML", new Vergleich());

    if (i2 >= 0) {
      System.out.println("Found at index " + i2);
      System.out.println("Object is " + bibo.meineBuecher.get(i2));
    }

    // Search for element in list
    //int index = Collections.binarySearch(bibo.meineBuecher, "Java2");
    //System.out.println("Found Java2 @ " + index);

    // Search for element not in list
    //index = Collections.binarySearch(bibo.meineBuecher, "J");
    //System.out.println("Didn't find J @ " + index);
	
	// Vorschau 2
	System.out.println("\nContent of LinkedList:\n");
	for( Iterator i = bibo.meineBuecher.iterator(); i.hasNext(); )
	System.out.println(i.next());

   }

}

Die Fehlermeldung die der Compiler immer wieder ausgibt ist:

HalloBib.java:35: cannot find symbol
symbol: method binarySearch(java.util.LinkedList(Buch), java.lang.String,Vergleich)
location: class java.util.Collections
 
Hallo,

in deinem Quellcode fehlen die Definitionen der Collection (meineBuecher) und des Comparators (Vergleich). So kann man leider nicht genau sehen, was falsch ist. Vielleicht hilft ja schon dieses (unvollständige) Beispiel:

Java:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Test {
 
    private static class Book {
    }

    private static class BookComparator implements Comparator<Book> {
        public int compare(Book b1, Book b2) {
            return 0;
        }
    }

    public static void main(String[] args) {

        List<Book> books = new ArrayList<Book>();
        Collections.binarySearch(books, new Book(), new BookComparator());
    }
}
 
in deinem Quellcode fehlen die Definitionen der Collection (meineBuecher) und des Comparators (Vergleich).

hier die zwei Ausschnitte:

Java:
import java.util.Collections;
import java.util.LinkedList;

public class Bibliothek {

	public LinkedList<Buch> meineBuecher;

    public Bibliothek() {
		meineBuecher = new LinkedList<Buch>();
		System.out.println("Hallo, ich bin eine Bibliothek, die 10 Buecher aufnehmen kann!");
    }

    public boolean sortiertesEinfuegen(Buch neuesBuch) {
        System.out.println("Ich habe das Buch " + neuesBuch + " aufgenommen!");
		meineBuecher.addFirst(neuesBuch);
		//meineBuecher.sort();
		return true;
    }
	
	public Buch sucheNachISBN(String isbn) {
		Buch book = new Buch("1234");
		//int i = meineBuecher.binarySearch(meineBuecher, book);
		return book;
	}
	/*
	public Collection sucheNachAutor(String autor) {
		Collection list = new Collection();
		return list;
	}*/
	
}

Java:
public class Vergleich implements java.util.Comparator<Buch>{

  public int compare(Buch b1,Buch b2){
    return b1.compareTo(b2);
  }
  
}

Ich könnte anhand deines Beispielcodes keinen Unterschied zu meinem finden ... außer dass ich LinkedList benutze ... Oder geht binarySearch etwa nicht mit LinkedList's?

Weil so eine Liste stell ich mir ja eher linear vor, binär klingt eher nach einem Baum ... ??
 
Binary Search hat nichts mit Bäumen zu tun. Das ist einfach der Name eines Suchalgorithmus (Binäre Suche ? Wikipedia).

Die Methode hat ja folgende Signatur:

Java:
public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c)

erwartet also Parameter vom (im weitesten Sinne) gleichen Typs (Liste mit Büchern, Buch das gesucht wird, Buch-Vergleicher). Du übergibst aber als zweiten Parameter einen String. Deswegen der Fehler. Wenn du ein Buch nach Namen finden willst kann das etwa so aussehen:

Java:
public class BookNameComparator implements Comparator<Book> {
    public int compare(Book b1, Book b2) {
        return b1.getName().compareTo(b2.getName());
    }
}

...

Collections.binarySearch(books, new Book("UML"), new BookComparator());
 
erwartet also Parameter vom (im weitesten Sinne) gleichen Typs (Liste mit Büchern, Buch das gesucht wird, Buch-Vergleicher). Du übergibst aber als zweiten Parameter einen String. Deswegen der Fehler.

Ohh man, besten Danke für den Hinweis !!
Beschäftige mich leider noch nicht so lange mit Java und tu mir daher noch teils etwas schwer die Javadoc zu verstehen ...

Schönen Abend noch!
 
Eine LinkedList ist für eine binäre Suche btw ungeignet weil der Zugriff auf ein Element anhand des Indizes nicht sehr effizient ist. Laut Doku nutzt die binarySearch Methode in dem Fall dann auch eine lineare Suche.

Für mich klingt das eher nach einem Anwendungsfall für eine HashMap oder auch eine TreeMap wenn die Einträge unbedingt sortiert sein müßen.
 
Hallo Lumaraf,

danke für die Info ...
Es handelt sich nicht um einen konkreten Anwendungsfall sondern lediglich um eine Übungsaufgabe zum Lernen :-/

Gruß
 

Zurück
Oben