PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ArrayList Inhalt in while Schlaufe prüfen/vergleichen



CheGuevara
08-05-2007, 19:48
Hallo Leute

In einer QuickSort Klasse wird ein ListArray übergeben und soll sortiert werden.
Nun habe ich das Problem, dass ich in einer while Schlaufe prüfe ob ein HI Wert (Inhalt des Arrays) grösser ist als der LO Wert:

Hier ein Beispiel eines "normalen" Arrays


while (list[hi].getMInstanz().compareTo(Wert) >= 0 && lo < hi) {
hi--;
}
while (list[lo].getMInstanz().compareTo(Wert) < 0 && lo < hi) {
lo++;
}


Nun habe ich das Problem, dass ein ArrayList zuerst gecastet werden muss, bis man auf den Wert zugreifen kann.
zBsp.:


while ((Daten ti = (Daten) LISTE.get(HI)) ti.compareTo(Wert) >= 0 && lo < hi) {
hi--;
...

Hier muss der Eintrag aus dem ArrayList in ein Datenformat "Daten" gecastet werden und dann auf diesem Objekt die Methode "get" aufgerufen und diese dann verglichen werden.

Dies funktioniert natürlich nicht.
Kann mir jemand hierbei helfen?

Natürlich steht die Variante (Methode) toArray() zur Verfügung, mit welcher ich das ArrayList zuerst in ein "normales" Array umkopiere und nach der Sortierung wieder in ein ArrayList kopieren muss.
Jedoch erscheint mir diese Variante zu "unschön".

Hat jemand eine Idee

Gruss
Che

bischi
08-05-2007, 19:51
Ich nehme mal an, du hast auf die Klasse Daten Zugriff; Dann schreib doch einfach eine Funktion Daten.getValueAsInt(), welche dir einen Int-Wert zurückgibt, welchen du vergleichen kannst (oder was auch immer du vergleichen willst...)

MfG Bischi

CheGuevara
08-05-2007, 19:59
Verstehe ich nicht!
Die Klasse Daten ist nicht statisch. Im ArrayList sind viele Objekte des Datentyps Daten.


public class CDaten {
private String mUserName;
private String mTransaction;
private int mUsedCounter;

public String getMTransaction() {
return mTransaction;
}
public void setMTransaction(String transaction) {
mTransaction = transaction;
}
public int getMUsedCounter() {
return mUsedCounter;
}
public void setMUsedCounter(int usedCounter) {
mUsedCounter = usedCounter;
}
public String getMUserName() {
return mUserName;
}
public void setMUserName(String userName) {
mUserName = userName;
}
}

bischi
08-05-2007, 20:59
Aber auf den Quelltext von "daten" hast du Zugriff?

MfG Bischi

CheGuevara
08-05-2007, 22:00
Ja.
Hab ich ja auch geschrieben. (Daten == CDaten) Im Beispiel steht Daten, sollte aber CDaten stehen

Gruss
Che

Liberty
09-05-2007, 02:06
Nun habe ich das Problem, dass ein ArrayList zuerst gecastet werden muss, bis man auf den Wert zugreifen kann.



while ((Daten ti = (Daten) LISTE.get(HI)) ti.compareTo(Wert) >= 0 && lo < hi) {
hi--;
...

Hier muss der Eintrag aus dem ArrayList in ein Datenformat "Daten" gecastet werden und dann auf diesem Objekt die Methode "get" aufgerufen und diese dann verglichen werden.

Dies funktioniert natürlich nicht.
Kann mir jemand hierbei helfen?



Das rot eingefärbte ist schonmal kein Java, ich hoffe, das hast Du nicht wirklich versucht...

Ich ignoriere jetzt mal den gesamten Rest und nehme mir nur die Bedingung der while-Schleife vor:



while (((Daten)(LISTE.get(HI))).compareTo(Wert) >= 0 && lo < hi )


Das müsste eigentlich funktionieren, denn wofür hast Du denn die Referenz ti noch extra casten wollen? Brauchst Du die später noch? Kann eigentlich nicht sein, denn die einzig wichtigen Variablen sind doch die beiden pointer hi und lo, oder?

So, ich geh' jetzt pennen.

So long,
Liberty

mamue
09-05-2007, 08:03
Sollte nicht CDaten Comparable sein? Erst dann macht doch compareTo() Sinn, oder?


public class CDaten implements Comparable {
public int compareTo( Object other ) {
if( this.mUserName.compareTo( other.mUserName ) <= 0 ) {
return -1;
}
//...
}
}


Sonst bringt ein Vergleich eigentlich wenig.

HTH
mamue

fs111
09-05-2007, 17:56
Warum willst Du die Sortierung neu implementieren: Implementier Comparable und benutz dann das hier: http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#sort(java.util.List)

fs111

bischi
09-05-2007, 18:51
Oder eben: Du schreibst eine Funktion in CDaten, welche dir einen Wert zurückgibt, den du einfach vergleichen kannst (bspw. int, double,...)

MfG Bischi

fs111
09-05-2007, 18:59
Oder eben: Du schreibst eine Funktion in CDaten, welche dir einen Wert zurückgibt, den du einfach vergleichen kannst (bspw. int, double,...)

MfG Bischi

Ähm, genau das macht Comparable ja: http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Comparable.html

bischi
09-05-2007, 19:50
Ähm, genau das macht Comparable ja: http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Comparable.html

Ja - nur musst du dann mit allen möglichen Datentypen vergleichen können - das ginge eventuell sonst einfacher (ist dann natürlich weniger schön...)

Mfg Bischi

mehlvogel
10-05-2007, 08:09
public class CDaten implements Comparable<CDaten> {
public int compareTo(CDaten other ) {
/*...


Problem gelöst ;)

Falls es < 1.5 sein muss soll eine ClassCastException bei unvergleichbaren Objekten geschmissen werden.

Falls es sich um eine Übungsaufgaben handelt (z.B. um Quicksort zu implementieren ;)) sollte die Lösung, die Liberty gegeben hat schon ausreichen.