Generische Datentypen MergeSort

Status
Nicht offen für weitere Antworten.

bliko

Mitglied
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

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:

Marco13

Top Contributor
Ja, da wird eine neue Liste erstellt, und die wird dann sortiert - davon weiß der Array ja nix. Abhilfe...
Code:
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);

        // Nachher wieder (sortiert) in den Array schreiben:
        for (int i=0; i < sammlung.length; i++){
            sammlung[i] = l.get(i);
        }
    }


Ansonsten ... Nimm die Kommentare raus ... man findet sonst http://public.beuth-hochschule.de/~oo-plug/A&D/prog/kap561/MultiMerge.java :autsch:
 

bliko

Mitglied
Ja, da wird eine neue Liste erstellt, und die wird dann sortiert - davon weiß der Array ja nix. Abhilfe...
Code:
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);

        // Nachher wieder (sortiert) in den Array schreiben:
        for (int i=0; i < sammlung.length; i++){
            sammlung[i] = l.get(i);
        }
    }
 

Marco13

Top Contributor
Ach ja, er gibt auch noch eine Neue Liste zurück :eek:
Code:
public void sort(E[] sammlung) {
        List<E> l = new Vector<E>();
        for (int i=0; i < sammlung.length; i++){
            l.add(sammlung[i]);
        }
        [b]l = mergeSort(l);[/b] // Ergebnis von MergeSort als 'l' speichern

        // Nachher wieder (sortiert) in den Array schreiben:
        for (int i=0; i < sammlung.length; i++){
            sammlung[i] = l.get(i);
        }
    }
(es wird immer deutlicher, dass du das nicht selbst geschrieben hast ;) )
 
S

SlaterB

Gast
von Testen kann ja auch keine Rede sein,
Lösung zu spät, aber fast noch wichtiger:

Java:
        System.out.println("list  vor: " + l);
        l = mergeSort(l);
        System.out.println("list nach: " + l);
(mit entsprechenden toString() in Film, sonst Ausgabe über Schleife)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
leifg Rechenoperationen auf generische Datentypen Allgemeine Java-Themen 10
M Generische Datentypen Allgemeine Java-Themen 14
Zrebna Random Number - Generische Formel zwischen zwei INKLUSIVEN Werten Allgemeine Java-Themen 16
F Verständnisprobleme Aufgabenstellung Aktionsobjekte und generische Listen Allgemeine Java-Themen 1
J Generische Interface - Problem Allgemeine Java-Themen 3
J Generische Interfaces mehrfach einbinden Allgemeine Java-Themen 11
M Methoden Generische Methode für ArrayList Allgemeine Java-Themen 7
perlenfischer1984 Reflection : Element in generische Liste hinzufügen Allgemeine Java-Themen 4
D generische Interface und konkrete Methode Allgemeine Java-Themen 3
T Interface mit generische Typen Allgemeine Java-Themen 5
A Methoden Generische Methode mit Arrays - Source Compatibility 1.7 benötigt, wieso? Allgemeine Java-Themen 3
M Interface Generische Klassen mit mehreren Typen überschreiben Allgemeine Java-Themen 0
H Interface Generische Schnittstelle (rekusiv) Allgemeine Java-Themen 2
C generische Authentifizierung Allgemeine Java-Themen 7
JCODA Generische Map Frage Allgemeine Java-Themen 10
H Generische Array Allgemeine Java-Themen 11
M Problem beim schreiben einer eigene generische Klasse Hashtable Allgemeine Java-Themen 11
M Generische Methoden mit Java und globale Variablen Allgemeine Java-Themen 9
M Problem beim schreiben einer eigene generische Klasse LinkedList Allgemeine Java-Themen 34
D generische Klasse für alle Maps (nicht Collections :-)) Allgemeine Java-Themen 11
D Methode für generische enummap/enum Allgemeine Java-Themen 10
M Generische Klassen Allgemeine Java-Themen 3
M generische Listener Allgemeine Java-Themen 2
S Generische Typen: Frage dazu Allgemeine Java-Themen 11
H generische Klasse Realtion Allgemeine Java-Themen 2
T Ideenfindung: Generische Transportklasse? Allgemeine Java-Themen 3
C Generische Methode (Schablone) Allgemeine Java-Themen 8
G generische Klasse als Parameter einer generischen Klasse Allgemeine Java-Themen 5
B Generische Typen instanzieren Allgemeine Java-Themen 11
R Generische Listener und Sender Allgemeine Java-Themen 12
S Generische Liste Allgemeine Java-Themen 30
F Viele generische Parameter sinnvoll? oder besser casten? Allgemeine Java-Themen 10
S Generische Methode Allgemeine Java-Themen 13
R Frage zu einfügen in generische lineare Liste Allgemeine Java-Themen 7
S Generische Methoden Allgemeine Java-Themen 7
D Statische, generische Methode will nicht. Allgemeine Java-Themen 2
B Mit welchen Datentypen und Strukturierung am Besten dutzende Baccaratspiele Shcritt für Schritt durchsimulieren? Allgemeine Java-Themen 26
B Abstrakte Datentypen synchronisieren Allgemeine Java-Themen 11
M Technische Realisierung von Atomic Datentypen Allgemeine Java-Themen 16
D JNA Speicherbelegung der Datentypen Allgemeine Java-Themen 13
H Mehrere Datentypen in einer Arraylist speichern Allgemeine Java-Themen 9
W Primitive Datentypen - Klassenpfad auflösen? Allgemeine Java-Themen 6
S Parametrisierte jUnit 5-Tests mit eigenen Datentypen/Klassen-Objekten als Test-Parameter Allgemeine Java-Themen 0
F Datentypen Kopieren von Datentypen Allgemeine Java-Themen 10
Asphorm Datentypen Datentypen werden nicht ordnungsgemäß umgewandelt Allgemeine Java-Themen 1
J Datentypen in Java Tabelle Allgemeine Java-Themen 2
B Chat auf andere Datentypen aufteilen Allgemeine Java-Themen 2
I Abstrakte Datentypen - Liste Allgemeine Java-Themen 9
M ArrayList mit verschiedenen Datentypen in String konvertieren Allgemeine Java-Themen 10
C Best Practice [Arrays] Wie sinnvoll prüfen, ob Array primitive Datentypen enthält? Allgemeine Java-Themen 6
P Objekt mit verschiedenen Datentypen Allgemeine Java-Themen 5
H Datentypen Collection für SQL-Datentypen Allgemeine Java-Themen 2
M Java-Threads und Datentypen-Zugriffe Allgemeine Java-Themen 7
O primitive Datentypen threadsicher? Allgemeine Java-Themen 13
B Sortieren mit generischen Datentypen Allgemeine Java-Themen 3
X Duplikate aus eigenen Datentypen entfernen Allgemeine Java-Themen 14
I Probleme mit Datentypen Allgemeine Java-Themen 4
D Addition generischer Datentypen Allgemeine Java-Themen 12
C Primitive Datentypen in Threads Allgemeine Java-Themen 4
E Quelltext nach Datentypen durchsuchen Allgemeine Java-Themen 10
the[V]oid Primitive Datentypen Wrappen und als primitiv markieren? Allgemeine Java-Themen 7
B Eigene Datentypen Allgemeine Java-Themen 5
H Linksschieben << bei long-Datentypen Allgemeine Java-Themen 2
R Problem mit Datentypen Allgemeine Java-Themen 7
Devin Mergesort verstehen Allgemeine Java-Themen 3
Kirby.exe K-Way MergeSort Allgemeine Java-Themen 33
L MergeSort allgemein Allgemeine Java-Themen 61
J Rekursion Mergesort Allgemeine Java-Themen 10
U Methoden Algorithmus MergeSort String [ ] array sortieren programmieren Allgemeine Java-Themen 17
X MergeSort Laufzeit Problem Allgemeine Java-Themen 4
T Threads Mergesort mit limitierter Threadanzahl Allgemeine Java-Themen 2
S MergeSort iterativ und rekursiv? Allgemeine Java-Themen 8
B Hilfe beim Verständnis von Mergesort Allgemeine Java-Themen 5
R MergeSort funktioniert nicht Allgemeine Java-Themen 5
D MergeSort Allgemeine Java-Themen 19
H [LinkedList] Sortieren durch MergeSort Allgemeine Java-Themen 3
N externes Sortieren (MergeSort Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben