Ich habe eine Schnittstelle für verschiedene Sortieralgorithmen gebaut. Ich möchte nun den Algorithmus MergeSort, dem in der Grundstruktur Listen zugrunde liegen, in ein Array umwandeln und dann die bereits fertigen Methoden mergeSort bzw. merge aufrufen. Es kommen zwar keine Fehlermeldungen, doch sortiert wird auch nicht. Die beiden Methoden sind korrekt, wurden an anderer Stelle und in einem andeen Zusammenhang getestet, es liegt also nicht an deren Algorithmus, sondern wahrscheinlich an der Übergabe von irgendwelchen Parametern. Im folgenden nun die Dateien:
die Schnittstelle Sort
die Klasse MergeSort;
damit sie der Schnittstelle entspricht, habe ich vorneweg die verlangte Methode sort geschrieben, die nichts anderes macht, als eine Liste in ein Array umzuwandeln um dann die Methode mergeSort aufzurufen. Dort liegt wahrscheinlich der Fehler, doch weiß ich nicht genau, wo, muss dort irgendetwas gecastet werden?
abschließend noch die Testklasse SortDemo.java
das Ganze ist schon etwas komplex, aber vielleicht kann mir jemand weiterhelfen, danke im voraus.
die Schnittstelle Sort
Java:
public interface Sort<E extends Comparable<E>> {
public void sort(E[] sammlung);
}
die Klasse MergeSort;
damit sie der Schnittstelle entspricht, habe ich vorneweg die verlangte Methode sort geschrieben, die nichts anderes macht, als eine Liste in ein Array umzuwandeln um dann die Methode mergeSort aufzurufen. Dort liegt wahrscheinlich der Fehler, doch weiß ich nicht genau, wo, muss dort irgendetwas gecastet werden?
Java:
import java.util.*;
public class MergeSort<E extends Comparable<E>> implements Sort<E> {
public void sort(E[] sammlung) {
List<E> l = new Vector<E>();
for (int i=0; i < sammlung.length; i++){
l.add(sammlung[i]);
}
mergeSort(l);
}
public List<E> mergeSort(List<E> sammlung) {
if (sammlung.size() <= 1)
return sammlung;
else {
int laenge = sammlung.size();
List<E> links = mergeSort(sammlung.subList(0, laenge/2));
List<E> rechts = mergeSort(sammlung.subList(laenge/2, laenge)); //
if (links.size() == 0)
return rechts;
else if (rechts.size() == 0)
return links;
else {
List<E> ergebnis = new Vector<E>(); // hier wird zusätzlicher Platz verbraucht
merge(ergebnis, links.iterator(), rechts.iterator());
return ergebnis;
}
}
}
public void merge(List<E> ausgabe,
Iterator<E> eingabe1, Iterator<E> eingabe2) {
E element1 = eingabe1.next(), element2 = eingabe2.next(); // erste Elemente
while (true)
if (element1.compareTo(element2) < 0) {
ausgabe.add(element1);
if (eingabe1.hasNext())
element1 = eingabe1.next();
else {
ausgabe.add(element2);
break;
}
} else { // symmetrisch: eingabe1.compareTo(eingabe2) >= 0
ausgabe.add(element2);
if (eingabe2.hasNext())
element2 = eingabe2.next();
else {
ausgabe.add(element1);
break;
}
}
while (eingabe1.hasNext())
ausgabe.add(eingabe1.next());
while (eingabe2.hasNext())
ausgabe.add(eingabe2.next());
} // eine der beiden Schleifen ist leer
}
abschließend noch die Testklasse SortDemo.java
Java:
public class SortDemo {
//static final ArrayList<String> al = new ArrayList(){};
private static final String testreihe = "EFACHBGD";
static <E extends Comparable<E>> void sorttest(E[] sammlung, Sort<E> algorithmus){
System.out.println("Eingabe: ");
for(E obj : sammlung){
System.out.print(obj);
}
algorithmus.sort(sammlung);
System.out.println("");
System.out.println("Ausgabe: ");
for(E obj : sammlung){
System.out.print(obj);
}
System.out.print("\n");
}
/**
* @param args
*/
public static void main(String[] args) {
Film[] filme = new Film[]{new Film("007","action", 200), new Film("Sissi", "kitsch", 100)};
Character[] reihung = new Character[testreihe.length()];
for (int i = 0; i < reihung.length; i++)
reihung[i] = testreihe.charAt(i);
System.out.println("BubbelSort<Character>:");
sorttest(reihung, new BubbleSort<Character>());
System.out.println("");
/*
System.out.println("BubbelSort<Film>:");
sorttest(filme, new BubbleSort<Film>());
*/
System.out.println("MergeSort<Film>:");
sorttest(filme, new MergeSort<Film>());
}
}
das Ganze ist schon etwas komplex, aber vielleicht kann mir jemand weiterhelfen, danke im voraus.
Zuletzt bearbeitet: