PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : InsertionSort in Java


Seppo
2003-11-23, 10:11:44
import java.util.*;

public class Sortieren {

public static Vector vertausche(Vector v, int i, int j) {
Vector hilf = new Vector(1);
hilf.addElement(v.elementAt(i));
v.add(i, v.elementAt(j));
v.add(j, hilf);
return v;

}

public static Vector InsertionSort(Vector v) {

Studi a;
Studi b;
Studi c;
Studi d;

for (int i = 1; i < v.size(); i++) {
a = (Studi) v.elementAt(i);
b = (Studi) v.elementAt(i - 1);
if (a.getNachname().compareToIgnoreCase(b.getNachname()) < 0) {
for (int j = i; j > 0; j--) {
c = (Studi) v.elementAt(j);
d = (Studi) v.elementAt(j - 1);
if (c.getNachname().compareToIgnoreCase(d.getNachname()) < 0) {
vertausche(v, j - 1, j);
}
}
}
}

return v;

}

}



Es sollen Objete von der Klasse Studi nach Nachname sortiert werden.
In dieser Zeile (b = (Studi) v.elementAt(i - 1)) bekomme ich immer eine ClassCastException, aber warum? :(

El Fantastico
2003-11-23, 11:54:35
Das Problem ist wohl, dass der Vektor an dieser Position kein Objekt vom Typ Studi enthält. Warum können wir Dir leider nicht sagen, dazu müsstest Du den Aufruf der Methode posten ;)

Deine vertausche() Methode kannst Du übrigens etwas effizienter implementieren, wenn Du statt des Hilfsvektors eine temporäre Objektreferenz benutzt. Also:


Object temp;

temp = v.elementAt(i);

v.add(i, v.elementAt(j));

v.add(j, temp);

Seppo
2003-11-23, 13:01:23
public class Studi {

private String nachname;
private String vorname;
private String hauptfach;
private String email;

public Studi() {

}

public Studi(String n, String v, String h, String e) {
nachname = n;
vorname = v;
hauptfach = h;
email = e;

}


public String getEmail() {
return email;
}


public String getHauptfach() {
return hauptfach;
}


public String getNachname() {
return nachname;
}


public String getVorname() {
return vorname;
}


public void setEmail(String s) {
email = s;
}


public void setHauptfach(String s) {
hauptfach = s;
}


public void setNachname(String s) {
nachname = s;
}


public void setVorname(String s) {
vorname = s;
}

}



import java.io.*;
import java.util.*;

public class Programm {

static String datei;
static RandomAccessFile f;
static Vector Liste = new Vector();
static Vector l = new Vector();

public static String ZeileEinlesen(RandomAccessFile f) {

String zeile;

try {

while ((zeile = f.readLine()) != null) {
return zeile;
}
} catch (IOException e) {
}

return null;
}

public static void main(String[] args) {

StringTokenizer s;
String zeile;
BufferedReader r = new BufferedReader(new InputStreamReader(System.in));

try {
datei = r.readLine();
} catch (IOException e) {
System.out.println("Ungültige Eingabe");
}

try {
f = new RandomAccessFile(datei, "r");
} catch (FileNotFoundException e) {
System.out.println("Datei nicht gefunden");
}

while ((zeile = ZeileEinlesen(f)) != null) {
s = new StringTokenizer(zeile);
try {
Liste.addElement(new Studi(s.nextToken(), s.nextToken(), s.nextToken(), s.nextToken()));
} catch (NoSuchElementException e) {
System.out.println("Fehler in Datei");
}

}

l = Sortieren.InsertionSort(Liste);
Studi hilf;
for (int i = 0; i < l.size(); i++) {
hilf = (Studi) l.elementAt(i);
System.out.println(hilf.getNachname());
}

}
}


Das hier sind die Klassen Studi und Programm, dort wird das Programm auch gestartet. Es wird eine Textdatei eingelesen, in denen die Daten durch Leerzeichen von einander getrennt sind.

HellHorse
2003-11-23, 17:37:38
Also, das vertauschen, bauchst du nicht selbst zu machen. Einfach Collections.swap() (http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#swap(java.util.List,%20int,%20int)).
So liesse sich auch das sortieren machen, aber das ist wohl in der Aufgabenstellung nicht erlaubt.
Ich kann dir auch sagen, woher deine ClassCastException kommt.

v.add(j, hilf);


I.A. Finger weg von Vector's, List's nehmen.

Senior Sanchez
2003-11-28, 17:11:09
I.A. Finger weg von Vector's, List's nehmen.

naja, so würde ich das nich sagen, vector sind einfach synchronized und lists nich, also sind listen in der regel schneller ;-)

mfg Senior Sanchez

HellHorse
2003-11-28, 18:16:10
Original geschrieben von Senior Sanchez
naja, so würde ich das nich sagen, vector sind einfach synchronized und lists nich, also sind listen in der regel schneller ;-)

mfg Senior Sanchez
Und ich habe schon darauf gewartet, dass jemand kommt
"aber java.util.Vector implementiert ja java.util.List". :D
Vector ist einfach eine Vor-Collection-Framework-Klasse die angepasst wurde.
ArrayList macht das gleiche ohne den Sychnonisationsoverhead.
Zudem sollte man sowieso nach Möglichkeit gegen ein Interface (List) und nicht gegen eine konkrete Klasse programmieren.