2010-02-23 19 views
10

ich beschäftigt bin für die MCTS 70-536 Prüfung vorbereiten, nach der Prüfung Buch (Microsoft Press - .NET Framework - Application Development Foundation Selbststudium Training Kit 2nd Edition), das Codebeispiel:Arraylist Binary

ArrayList al = new ArrayList(); 
al.AddRange(new string[] { "Hello", "world", "this", "is", "a", "test" }); 
Console.WriteLine(al.BinarySearch("this")); 

Gibt den Wert '2' an die Konsole aus, da das Element 'this' auf Index 2 steht. Vereinbart, dass dies die Ausgabe ist, die ich erhalte, wenn ich diesen Code ausführe.

Allerdings, wenn ich

Console.WriteLine(al.BinarySearch("world")); 

betreiben ich erwarten würde den Wert 1 in der Konsole seit ‚Welt‘ bei Index 1 sein würde, zu bekommen, aber ich den Wert -7 bekommen?

Könnte jemand bitte erklären, wie das funktioniert?

Dank

Antwort

11

Das Array, das Sie auf die binäre Suche ausführen nicht sortiert ist. Dies ist Voraussetzung für die Funktion BinarySearch.

Nicht sortiert, verwirrt den Suchalgorithmus und lässt ihn denken, dass "Welt" auf dem 7. Platz sein sollte, aber es ist nicht im Array: Das Ergebnis ist -7.

+0

Danke, das hat mir bessere Ergebnisse gegeben. Ich bin ziemlich überrascht von dem Fehler im Buch. Es klang ein bisschen komisch, wenn eine .BinarySearch (s) und eine .IndexOf (s) -Methode dasselbe taten. –

3

direkt aus MSDN-Dokumentation von ArrayList.BinarySearch Genommen (http://msdn.microsoft.com/en-us/library/5tzt7yz3%28VS.85%29.aspx)

Der Wert Parameter und jedes Element des Arraylist muss die IComparable-Schnittstelle implementieren, die für Vergleiche verwendet wird. Die Elemente der ArrayList müssen bereits in ansteigender Wert nach der Sortierung Reihenfolge sortiert werden, die durch die IComparable Implementierung definiert wird; Andernfalls könnte das Ergebnis falsch sein.

0

Vom documentation:

Der nullbasierte Index des Wertes in der Arraylist sortierte, wenn der Wert gefunden wird; andernfalls eine negative Zahl, die das bitweise Komplement des Index der das nächste Element ist, das größer als Wert ist oder, wenn es kein größeres Element ist, das bitweise Komplement des Count.

Beachten Sie die sortiert Wort.

1

Frage bereits beantwortet, aber diese als Referenz hinzugefügt.

Die BinarySearch findet Elemente mithilfe eines sortierten Algorithmus. In Ihrem Beispiel ist die Standardsortierung alphabetisch, also "Welt" sollte zuletzt sein, daher Nummer 7.

Sie sehen einen Überlader der BinarySearch, der ein IComparer-Objekt akzeptiert. Um dies nicht zu liefern, gibt man die alphabetische Standardart an.

Wenn Sie jedoch die "reverseSort" -Methode implementiert haben, wie im Buch vorgeschlagen, müssten Sie die BinarySearch-Funktion das "reverseSort" -Objekt übergeben.

Gefällt mir dies;

Console.WriteLine(al.BinarySearch(al, new reverseSort())); 

auch so wie ich fand es sehr interessant, wenn man die „ReverseSort“ Klasse implementieren und eine Console.WriteLine tun, auf dem Vergleich erhalten Werte wurden die Ergebnisse nicht, was ich erwarten würde. Ich verbrachte eine Weile damit, herauszufinden, was der Algorithmus war.