Selection Sort für beliebige Objekte

ETITstud

Mitglied
Hallo,

ich habe ein Problem bei der Implementierung von Selection Sort. Alle folgenden Methoden wurden uns vorgegeben und müssen implementiert werden. Zur Zeit hängt sich der Sortier-Algorithmus anscheinend irgendwo auf (Endlosschleife). Vielleicht kann mir ja jemand helfen, den Fehler zu finden oder eventuell die Methoden zu optimieren! Danke schon mal!

Java:
	@Override
	public  List getData() {
		return data;
	}

	@Override
	public Object getMax() {
		Comparable ob1=null;
		Comparable ob2=null;
		Object obj1 = data.get(0);
		Object obj2;
		int ergebnis;
		try{
			
		if (comp = false){
			for(int i = 1; i < ((Vector) data).capacity(); i++){
				ob2 = (Comparable) data.get(i);
				ergebnis = ob1.compareTo(ob2);
				if (ergebnis == 1){
					ob1 = (Comparable) data.get(i);
				}
			}
		}
		else if(comp = true){
			for(int k = 1; k<((Vector) data).capacity();k++){
				obj2 = data.get(k);
				if(com.compare(obj1,obj2)== -1){
					obj1 = obj2;
					}
				}
			}
		}catch(NullPointerException npe){
			
		}
		return ob1;
	}

	@Override
	public Object getMin() {
		Comparable ob1 = null;
		Comparable ob2 = null;
		Object obj1 = data.get(0);
		Object obj2;
		int ergebnis;
		try{
		
		if (comp = false){
			for(int i = 1; i < ((Vector) data).capacity(); i++){
				ob2 = (Comparable) data.get(i);
				ergebnis = ob1.compareTo(ob2);
				if (ergebnis == -1){
					ob1 = (Comparable) data.get(i);
				}
			}
				
		}else if(comp = true){
			for(int k = 1; k<((Vector) data).capacity();k++){
				obj2 = data.get(k);
				if(com.compare(obj1,obj2)== 1){
					obj1 = obj2;
					}
				}
			}
		}catch(NullPointerException npe){
			
		}
		return ob1;
		
	}

	@Override
	public <T extends Comparable<T>> void setData(Collection<T> arg0) {
		data.addAll(arg0);

	}

	@Override
	public <T> void setData(Collection<T> arg0, Comparator<T> arg1) {
		com = arg1;
		data.addAll(arg0);
		comp = true;
		

	}

	@Override
	public void sort() {
		try{
			Object ob;
			Vector<Object> vec= new Vector<Object>();
			int i=0;
			while(((Vector) data).capacity()>0){
				ob=getMin();
				vec.add(i,ob);
				i++;
				data.remove(ob);
			}
			data.addAll(0, vec);
		}
		catch (IllegalArgumentException iae){
			
		}
	}[/Java]
 
Hi,
hab das mit der Ausgabe mal gemacht und er springt immer von der Methode "getMin" zu der Methode "Sort". Also müsste das Problem ja in der while Schleife von der Sort-Methode liegen, aber ich versteh nicht warum es dort zu einer Endlosschleife kommt.???:L
 
Du fängst exceptions, geb die auch aus, vielleicht kommt da schon der fehler ans licht. fangen ohne auswertung ist unnütz
 
Was meinst du mit "ausgeben"? Eine Bildschirmausgabe, falls die Exception gefangen wird? (Das hab ich gerade versucht, die Exception wird nicht aufgerufen).
 
Da data.remove() wohl nicht klappt, ist im getMin sicher was falsch. bau da an jedem abzweig sysout ein und schau ob er so reagiert wie du es erwartest
 
Das ist deine Chance, den Umgang mit einem Debugger zu lernen. Einfach Schritt für Schritt durchs Programm steppen und schauen, ob's irgendwo hakt...
 
Fange NIEMALS runtime exceptions... als erster Rat... also weg mit deinen try / catch sachen.

weiterhin nutze size() und nicht capacity().... remove ändert nix an der Kapazität des Vectors, aber an seiner größe
 
[Java]
public Object getMin() {
Comparable ob1 = null;
Comparable ob2 = null;
Object obj1 = data.get(0);
Object obj2;
int ergebnis;

if (data != null && com != null){
if (comp = false){
for(int i = 1; i < ((Vector) data).size(); i++){
ob2 = (Comparable) data.get(i);
ergebnis = ob1.compareTo(ob2);
System.out.println("getmin");
if (ergebnis == -1){
ob1 = (Comparable) data.get(i);
}
}
return ob1;
}
else{
for(int k = 1; k<((Vector) data).size();k++){
obj2 = data.get(k);
System.out.println("getmin2");
if(com.compare(obj1,obj2)== 1){
obj1 = obj2;
System.out.println("getmin3");
}
}
return obj1;
}

}
return null;
}
[/code]

Habe die getMin() Methode jetzt ein wenig verändert. Das Problem dürfte in dieser Methode behoben sein! Jetzt liegts noch an der sort() Methode, da sich die while-Schleife immer wiederholt.

Java:
	public void sort() {
		try{
			Object ob;
			Vector<Object> vec= new Vector<Object>();
			while(((Vector) data).size()>0){
				ob=getMin();
				vec.add(i,ob);
				i++;
				data.remove(ob);
				System.out.println("sort");
			}
			data.addAll(0, vec);
		}
		catch (IllegalArgumentException iae){
			
		}
	}

Die Variable habe ich als Klassenvariable definiert (public static int i😉. Kann es sein, dass auch die größe (size) des Vektors durch "remove" nicht verändert wird? Wie kann ich das Problem sonst lösen?

LG
 
nur die sort methode genommen
Java:
public void sort() {
        int i = 0;
        Object ob;
        Vector<Object> vec = new Vector<Object>();
        while ((data).size() > 0) {
            ob = getMin();
            vec.add(i, ob);
            i++;
            data.remove(ob);
            System.out.println("sort " + data);
        }
        data.addAll(0, vec);
    }
funktioniert... da ich getMin() gefaked habe bei mir ist das problem dort
 
Hm, wenn ich den Debugger verwende, wird mir angezeigt, dass das übergebene Objekt von der Methode getMin() den Wert null hat. Das bedeutet, dass bei der Methode setData() irgendetwas falsch sein muss. Hier noch mal die Methoden setData():

Java:
public <T extends Comparable<T>> void setData(Collection<T> arg0) {
		data.addAll(arg0);

}

public <T> void setData(Collection<T> arg0, Comparator<T> arg1) {
		com = arg1;
		data.addAll(arg0);
		comp = true;

Kann man die Methode addAll() verwenden um die übergebene Collection in dem Vector zu speichern? Oder muss ich irgendwie anders lösen?
 
Zuletzt bearbeitet:
Sooo, kleine Aktualisierung, die Sort() Methode funktioniert soweit. Es wird alles ausgegeben, jedoch kommen noch viele Fehler darin vor! Keine Ahnung woran das liegt und mittlerweile mit den Nerven am Ende! ^^
Hier noch mal der Code von der Sort Methode, der getMin Methode und den angezeigten Fehlern:
Java:
public Object getMin() {
		Comparable ob1 = null;
		Comparable ob2 = null;
		Object obj1 = data.get(0);
		Object obj2;
		int ergebnis;

		if (data != null){
			if (com == null){
				ob1 = (Comparable) data.get(0);
				for(int i = 1; i < ((Vector) data).size(); i++){
					ob2 = (Comparable) data.get(i);
					ergebnis = ob1.compareTo(ob2);
					if (ergebnis == 1 || ergebnis == 0){
						ob1 = (Comparable) data.get(i);
					}
				}
				return ob1;	
			}
			else if (com != null){
				for(int k = 1; k<((Vector) data).size();k++){
					obj2 = data.get(k);
					if(com.compare(obj1,obj2)== 1){
						obj1 = obj2;
					}
				}		
				return obj1;
			}

		}
		return null;
	}

Java:
public void sort() {
		try{
			Object ob;
			Vector<Object> vec= new Vector<Object>();
			while(((Vector) data).size()>0){
				ob = getMin();
				vec.add(i,ob);
				System.out.println(vec.get(i));
				i++;
				data.remove(ob);
				
			}
			
			data.addAll(0, vec);
		}
		catch (IllegalArgumentException iae){
			
		}
	}

1
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at java.lang.Integer.compareTo(Unknown Source)
at solutions.Solution06.getMin(Solution06.java:70)
at solutions.Solution06.sort(Solution06.java:108)
at de.tu_darmstadt.es.sopra.exercises.commands.ExcerciseCommand_Sort.doFirstTest(ExcerciseCommand_Sort.java:147)
at de.tu_darmstadt.es.sopra.exercises.commands.ExcerciseCommand_Sort.execute(ExcerciseCommand_Sort.java:91)
at de.tu_darmstadt.es.sopra.splitInterfaces.AbstractMenuListener.execute(AbstractMenuListener.java:75)
at de.tu_darmstadt.es.sopra.gui.SpielGUIController.actionPerformed(SpielGUIController.java:98)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.AbstractButton.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
3
3
4
5
8
9

Das ist die komplette Ausgabe. Keine Ahnung warum eclipse einen String in einen integer casten will. Vielleicht hat einer von euch noch eine Idee?

LG
 
Welche Zeile in getMin entspricht Zeile 70 in deinem File? Meine Fantasie versagt, wo dieses Problem auftreten könnte.

[EDIT] Ist halt noch früh - es müsste eigentlich Zeile 13 sein - vielleicht fragst du mal den ClassName von ob2 ab und gibst ihn aus ...
 
Zuletzt bearbeitet:
Ja, die Zeile 70 ist hier die Zeile 13. Die Objekte sind aber von der gleichen klasse, da die Objekte mit der get() Methode aus einer collection (vector) geholt werden. Ich verzweifel noch daran ! ^^ keiner eine idee, woran es liegen kann?
 
er sagt das er nicht in integer casten kann. kommt bei compareTo vlt String raus?
 
Zuletzt bearbeitet von einem Moderator:
Es soll jedes mögliche Objekt verglichen werden können. Compareto setzt ja voraus, dass die Objekte comparable implementieren. In einem vektor können doch nur Objekte einer klasse eingetragen werden?!

Kann gerade leider nicht überprüfen ob ob2 ein String ist weil ich unterwehs bin und nur ein Handy dabei habe.
 
was gibst du eigentlich rein zum sortieren? ein paar Integer objekte?
er hat ja anscheinend nur mit dem einem bestimmten objekt probleme, oder is es immer das zweite objekt egal was du reingibst?
 
Im Moment werden denke ich integer übergeben. Das ist jedoch schon von dem vorgegebenem rahmenwerk so bestimmt, da habe ich keinen Einfluss. Wir sollen 'nur' die Methoden implementieren. diese sollen mit jeglicher ubergebener Liste funktionieren.

Bin gegen Abend wieder am pc und kann dann mehr überprüfen 😉
 
Es soll jedes mögliche Objekt verglichen werden können.
Aha. Ist jetzt ein Goldfisch größer oder kleiner als eine Tasse Glühwein?

Compareto setzt ja voraus, dass die Objekte comparable implementieren.
Ja, aber Comparable ist generisch, man sollte also immer angeben, womit verglichen werden kann.

In einem vektor können doch nur Objekte einer klasse eingetragen werden?!

Java:
Vector<Comparable> v = new Vector<Comparable>();
v.add(Integer.valueOf(42));
v.add("Interessant");
v.add(new java.util.Date());

Und nun?
 
Zuletzt bearbeitet:
um landeis kommentar nochmal anhand deines Comparables zu zeigen
Java:
public static void main(String[] args) throws Exception {
        List<Comparable> comparables = new ArrayList<Comparable>();
        comparables.add("2");
        comparables.add(2);
        Collections.sort(comparables);
    }
daher ist Comparable wie schon gesat generisch und es muss auch explizit angegeben werden was sortiert wird... alles mal so geht leider nicht
 
Im Moment werden denke ich integer übergeben. Das ist jedoch schon von dem vorgegebenem rahmenwerk so bestimmt, da habe ich keinen Einfluss. Wir sollen 'nur' die Methoden implementieren. diese sollen mit jeglicher ubergebener Liste funktionieren.
dann müssen deine Methoden bzw deine Klasse ebenso generisch sein, die Verwender müssen dann das konkrete Objekt angeben (welches dann Comparable sein muss)
 
Hey,
sorry wenn ich mich da nicht genau genug ausgedrückt hatte, dass dies für alle Objekte gelten soll!

Ich versteh jetzt noch nicht ganz genau was ich alles verändern muss? In der getMin() Methode habe ich ja schon zwei Objekte vom Typ Comparable, die mit der Methode compareTo() verglichen werden. Aber anscheinend hakts da ja schon laut Fehlerausgabe. Was muss ich dort verändern? Und an welchen Stellen ist eine Veränderung noch wichtig?

LG
 
Hallo noch mal,
ich weiß jetzt schon mal genau was sortiert werden soll. Die Liste
[8,9,3,1,3,4,5,Flensburg, Hamburg, Darmstadt,...weitere Städtenamen]

Kann mir vielleicht noch jemand einen Tip geben, wie ich diese Int-String-Kombinationen jetzt sortieren kann? Kann ich irgendwie nur Integer-Werte und nur Strings vergleichen? wie bekomme ich diese aus der Liste heraus? Ich steh total auf dem Schlauch und wäre um jeden Ansatz dankbar!

LG
 
Zuletzt bearbeitet:
Du kannst z.B. so sortieren, dass jeder String "größer" als jede Zahl ist. Du könntest z.B. einen Comparator<Object> schreiben (weil außer Object Integer und String keine andere Oberklasse gemeinsam haben):

(aus'm Kopp)
Java:
public class IntStringComparator implements Comparator<Object> {
   public int compare(Object o1, Object o2) {
       if(o1 instanceof Integer) {
            if(o2 instanceof Integer) {
                return ((Integer)o1)-((Integer)o2;
            } else if (o2 instanceof String) {
                return -1;
            } 
       } else if (o1 instanceof String) {
            if(o2 instanceof String) {
                return ((String)o1).compareTo((String)o2);
            } else if (o2 instanceof Integer) {
                return 1;
            } 
       } 
       throw new IllegalArgumentException("WTF!?");
   }
}
 
Hallo noch mal,
ich weiß jetzt schon mal genau was sortiert werden soll. Die Liste
[8,9,3,1,3,4,5,Flensburg, Hamburg, Darmstadt,...weitere Städtenamen]

Kann mir vielleicht noch jemand einen Tip geben, wie ich diese Int-String-Kombinationen jetzt sortieren kann?
ehrlich gesagt kann das KEINER...

Vergleich mal 8 und Hamburg.... was ist "größer" ?

Wie du das sortieren willst kannst nur du wissen.... sind Zahlen immer größer ? immer kleiner ?

Auch wenn du alles als Comparable zusammenschusterst.... du kannst nicht Äpfel und Birnen einfach so mal eben vergleichen. Da musst du schon ausdrücken wie das zu sortieren ist
 

Neue Themen


Zurück
Oben