Elemente eines Array verschieben

kinglui

Aktives Mitglied
Hallo,

ich habe eine Methode, welche Elemente einer Arraylist vergleicht.
Falls x-Elemente gleich sein sollten, sollen diese in ein separates Array geschrieben werden (mind. 2, nach oben offen).

Irgendwie scheint hier aber noch nicht alles rund zu laufen.
Java:
	public void vergleiche() throws Exception{
		//Erstelle ArrayListe mit Userdaten
		List<UserDTO> StudArr = this.erstelle();
		//Erzeuge 2D Arrayliste 
		ArrayList<ArrayList<UserDTO>> StudArrDo = new ArrayList<ArrayList<UserDTO>>();
		int i = 0;
		Iterator<UserDTO> studListeIt = StudArr.iterator();
		while (studListeIt.hasNext()) {
			UserDTO userTmp = studListeIt.next();
			Iterator<UserDTO> studListeIt2 = StudArr.iterator();
			while (studListeIt2.hasNext()) {
				UserDTO userTmp2 = studListeIt2.next();
				//wenn es sich um versch. Arrayelemente handelt..
				if(userTmp.hashCode() != userTmp2.hashCode()){
					//Wenn die equals-Checks = true sind
					if(userTmp.equalsMail(userTmp2)
						| userTmp.equalsName(userTmp2) 
						| userTmp.equalsMatnr(userTmp2) 
						| userTmp.equalsLogin(userTmp2)){
							System.out.println("user: " + userTmp.getUsrID() + " und user: " + userTmp2.getUsrID() +  " sind gleich!");
							//erzeuge Unterarray mit dem Wert i und fuege die User hinzu
							StudArrDo.add(new ArrayList<UserDTO>());
							StudArrDo.get(i).add(userTmp2);
							StudArrDo.get(i).add(userTmp);
		                                        // i++; //Wenn ich hier hochzähle, wird ja bei jedem durchlauf ein array erzeugt, heißt, dass max. 2 gleiche Objekte in ein array kommen
					}	
				}
			}
			i++; // wenn ich hier hochzähle. java.lang.IndexOutOfBoundsException: Index: 5, Size: 2
		}
		//System.out.println(StudArrDo.size());
		//System.out.println(StudArrDo.get(0).size());
	}


kann mir jemand sagen, wo der Fehler liegt?
ich bin grad sehr auf meine Lösung fixiert!

danke
 
Würde dir empfehlen die equals() Methode der UserDTO Klasse zu überschreiben. Macht das ganze übersichtlicher.

Soll das in der if-Abfrage ein oder sein, oder ist || nicht |.

Zu deiner StudArrDo-Liste. Ist es nicht einfacher zuerst eine Liste zu erstellen, die User hinzufügen und dann erst zu der StudArrDo-Liste hinzufügen. ;-)
 
Hallo,

die equals() werde ich überschreiben, wenn alles läuft.
Ich teste ja auf verschiedene Attribute des Objekts und will erst sicher gehen, dass alle Tests iO. sind.

"oder" mit doppeltem "||" bedeutet, dass der Test danach weiter läuft, bei einfachem "|" reicht es, wenn eine Bedingung korrekt ist, danach bricht er ab.

Ciao
 
Das hast du irgendwie falsch verstanden dereinfache '|' ist das Bitweise oder das für Binärrechnungen verwendet wird und wird eigentlich nicht für vergleiche verwendet,

in einer IF-Bedingung solltest du '||' benutzen:

if (A||B)

Wenn a bereits true ist wird B nicht mehr geprüft, daher immer '||' verwenden.


Edit: der '|' .Operator wird auch noch

Logisches ODER mit vollständiger Auswertung genannt, d.h. wenn der erste Ausdruck true ergibt wird trotzdem noch der nächste Überprüft
 
Zuletzt bearbeitet:
okay. danke für die Info.
Das muss ich wirklich falsch aufgefasst haben.

Sei's drum, an meinem Ergebnis ändert es nichts.

danke
 
Mein Problem liegt ja augenscheinlich an Zeile 23, oder?
Das heißt ja, dass er das zu vergleichende Objekt bei jedem positiven Durchlauf ins Array schiebt.

Aber wie gesagt, ich weiß leider gerade nicht wirklich weiter. Ich will das jede Gruppe von gleichen Objekten in ein separates Unterarray kommt. Anzahl der User allgemein und gleich sind unbekannt.

danke
 
Also ehrlich gesagt verstehe ich nicht wirklich was du da machst.
Mach doch mal ein kleines reales Beispiel, damit das auch allen klar wird. ;-)

EDIT:

Du willst zu jedem Element in der Liste eine Liste von identischen Elementen?

A1, B2, C3, D4, A5, B6, A7

A1: A5, A7
B2: B6
C3:
D4:
A5: A1, A7
B6: B2
A7: A1, A5

So?
 
Zuletzt bearbeitet:
fast. ich will keine doppelten Arrays und ich brauche auch nur so viele Arrays, wie es doppelte Einträge gibt.


Also:

A1, B2, C3, D4, A5, B6, A7

1: A5, A7
2: B6


Ich weiß, dass das momentan nicht so aussehen wird, aber wenn alles laufen würde, würde ich die schon geprüften Objekte aus dem Array entfernen, um die doppelten Arrays zu vermeiden.

danke
 
so würde ich es machen:

- equals methode überschreiben (warum das wichtig ist, siehe punkt 2 und 3)
- deine Liste in ein HashSet packen (somit alle duplikate mit einer codezeile draussen)
- über dieses Set iterieren, für jedes Element Collections.frequency aufrufen und den return merken
- wenn return >= 2 die Elemente in deine returnliste schreiben

ob ich jetzt das richtig verstanden hab, weiß ich net so genau (hab nur kurz drüber geschaut) 🙂
 
Im Prinzip hört sich das gut an, aber vielleicht sollte ich noch einmal Kurz was über die User erzählen:

Doppelte User != doppelte Objekte im Array.
Dh. ich habe zB ein User:
login: peter
name: peter maffay

dann habe ich einen 2 User:
login: xyz
name: peter maffay

für das Array (oder das Hashset) sind das erstmal 2 versch. User. Daher suche ich über die Applikation nach versch. Attribute, die gleich sind und den User eindeutig identifizieren.

Ich bin mir gerade nicht sicher, ob du das in deiner Ausführung berücksichtigt hast?!

Danke
 
So,
ich hab das mal umgesetzt.
Allerdings wird mir dennoch angezeigt, dass jedes Objekt einmalig vorkommt:

Java:
public void vergleiche() throws Exception{
		//Testdata
		UserDTO max= new UserDTO();
		max.setFirstname("max");
		max.setLastname("max");
		max.setLogin("test0r");
		max.setPasswd("max");
		max.setTitle("herr");
		max.setGender("m");
		max.setEmail("max@gmail.com");
		max.setActiv(true);
		max.setMatnr("max.max");
		
		UserDTO test = new UserDTO();
		test.setFirstname("max");
		test.setLastname("max");
		test.setLogin("test0r");
		test.setPasswd("max");
		test.setTitle("herr");
		test.setGender("m");
		test.setEmail("max@gmail.com");
		test.setActiv(true);
		test.setMatnr("max.max");
		StudArr.add(max);
		StudArr.add(test);

		
		System.out.println(max.equals(test));
		Set UserListe = new HashSet(StudArr);
		Iterator<UserDTO> studListeIt = UserListe.iterator();
		while (studListeIt.hasNext()) {
			UserDTO userTmp = studListeIt.next();
			System.out.println(Collections.frequency(UserListe, userTmp));
		}
}
Die Ausgabe von max.equals(test) ist true, aber dennoch sind beide Objekte nur 1x vorhanden.

Meine Equalsmethode in UserDTO vereint jetzt alle anderen equalTests von vorher. Muss ich sonst noch was beachten?

Das Problem mit der "Verschiebenlogik" bleibt aber dennoch bestehen, oder? 😉

danke
 
für ein HashSet ist entscheidend, was hashCode() zurückliefert,
wenn sich da die Werte unterscheiden, nützt die beste equals-Methode nichts

TreeSet geht bestimmt ohne
 
sorry. ich bin jetzt hier ein wenig überfordert.
soll ich frequency() durch hashcode() austauschen, oder wie ist das jetzt gemeint?

Was stimmt denn an meiner Methode nicht?
Das "Konzept" ist doch ähnlich?!

danke
 
Okay,

da hier scheinbar auch keiner weiter weiß,
bleibe ich bei meiner Methode.

Könntet ihr mir dann wenigstens bei der Zusammenstellungslogik der Arrays helfen?
Wie gesagt, am Ende will ich sowas haben:
initArray = [A1, B2, C3, D4, A5, B6, A7]

-> finalArray [[a1, a5, a7],[b2,b6]]


danke
 
Sorry für die späte Antwort, ich war eine Woche im Urlaub!
Danke für den Link, der sieht auf den ersten Blick ganz nützlich aus.


Ich melde mich!

schönes WE
 

Zurück
Oben