Java, Objektüberhabe

ruNN0r

Erfahrenes Mitglied
Guten Tag,
ich hänge ein wenig fest...
In meinem Studium wurde mir eine Programmieraufgabe gestellt. Ich erspare euch die gesamte Aufgabe. Es handelt sich um eine Consolenanwendung.

Es gibt folgende Methode:
Code:
public boolean equals(Object x){
		
		
		System.out.println(x);
				
		
		return true;
	}

Diese soll ein Objekt dieser Klasse mit einem übergebenem Objekt (x) vergleichen.

Der Inhalt ist nicht vorgegeben sondern von mir gewählt und ich wollte nun wissen was denn übergeben wird.

Folgenden Aufruf habe ich in meiner Test Klasse:
Code:
CharCollection kette1 = new CharCollection('A', 'N', 'A', 'N', 'A', 'S');
char[] b2a = "(C, C, H, H, H, L, O, E, S, U)".toCharArray();
System.out.println(b2a);
System.out.println(kette1.equals(b2a));

Die erste ausgabe gibt mir den String exakt so aus wir ich ihn dort eingegeben und in ein CharArray umgewandelt habe. Jedoch die zweite Ausgabe mit dem Aufruf der Methode gibt mir komisches zurück... hier einmal die exakte Ausgabe:
Code:
(C, C, H, H, H, L, O, E, S, U)
[C@6ee964fe
true
Ich hoffe ihr könnt mir helfen... ich habe alles fertig aber diese Methode hängt mir schon seit 2 Tagen im Nacken und ich finde den Fehler nicht...

ich danke euch

Nachtrag:
das [C@**** ändert sich meist nach einer neuen Ausführung... daher denke ich dass es sich um eine Speicheradresse handelt... also bräuchte ich irgendwie einen Zeiger der mir auf den Wert zeigt... aber ich weiß nicht wie ich das in Java anstelle...
 
Zuletzt bearbeitet:
Hi,

musst du die Methode equals selbst ausformulieren, oder hast du die komplett hinzugefügt?

java bietet dir von Haus aus die Methode obj1.equals(obj2): true wenn beide Objekte den selben INHALT haben. Du kannst aber auch mit dem ==-Operator vergleichen, was aber nur true zurück liefert wenn du zwei selbe Objekte hast (aslo eher unsauber).

MfG Marschal
 
Es geht darum die Libs von Java kennen zu lernen und dabei Programmieren wir einige Libs von Java nach...
inzwischen haben wir die Java Util Klasse sowie die Linked List nachprogrammiert und noch einige andere kleinere sachen.

Es ist erlaubt teilweise, nicht Themenbezogene Libs zu verwenden. z.B. in diesem Fall die java.lang.String mit der Methode CharAt()... Aber die Equals Methode muss von uns selber erstellt werden...

Hier die Definition des Prof für diese Methode:
boolean equals(Object x)
Vergleicht eine Sammlung mit einem anderen Objekt x. Liefert true, wenn x eine Sammlung mit den gleichen Buchstaben ist, und ansonsten false. Die Reihenfolge spielt keine Rolle.

Hier die Aufgabenstellung:
Als Buchstabensammlung wird hier eine beliebig große, unveränderliche Sammlung von großen Buchstaben bezeichnet. In einer Sammlung können einzelne Buchstaben fehlen oder mehrfach enthalten sein. Die Reihenfolge ist irrelevant. Eine Sammlung ist zum Beispiel:
(A, B, R, A, K, A, D, A, B, R, A)
Definieren Sie auf der Grundlage von Arrays eine Klasse CharCollection, deren Elemente Sammlungen repräsentieren. CharCollection bietet folgende Funktionalität:

Dazu gibt es dann noch viele andere Methoden die ich bereits fertig habe. Ermitteln der Menge von verschiedenen Buchstaben. Filtere Buchstaben herraus usw... nur das ist hierfür direkt nicht relevant.
In meiner Klasse speichere ich meine Buchstabensammlung in einem Array (ebenfalls vorgegeben) und das soll ich dann mit dem übergebenem Objekt vergleichen.
 
Nun wenn diene CharCollection also eine von dir implementierte Klasse ist, musst du die equals-Methode überschreiben.

Wenn du sowas wie CharAt verwenden darfst, sollte das kein Problem sein:
der Aufruf ist ja wie folgt:
ob1.equals(obj2)
Das heißt du vergleichst einfach beide Arrays miteinander (soweit ich verstanden hab, basiert deine "collection" ja aud Arrays fester länge).
Obj1 ist ja dein Objekt welches die Methode aufruft, also hast du über this.variablen_name zugriff auf dein im Objekt gespeichertes Array. Das zweite bekommst du als Übergabeparameter.
nun ists doch nur noch eine schleife for, oder foreach.
 
In der Tat. Das ist auch nicht das Problem...
mein Problem ist der Übergabeparameter...
Bisher habe ich überhabeparameter gehabt die Klassenspezifisch waren. Sprich:
CharCollection equals (CharCollection *Variable*)

Aber hier jane ich
equals (Object x)
und dieses Object x macht mir probleme... denn es gibt mir "bullshit" zurück. Damit kann ich nicht vergleichen :(

Wenn ich das
Object x
durch ein
char[] x
ersetzt dann erhalte mein gewünschtes Ergebnis. Das darf ich aber nicht :D
 
Explizite Typkonvertierung ist hier das Stichwort.

Alle KLassen sind von Object abgeleitet, somit kannst du den dein x vom Typen Object in deinen gewünschten Typen casten.
Sowas wie:
Code:
@override
public boolean equals (Object obj2) {
charCollection convertedObj = new (charCollection) obj2;
//compare here...
}
sollte eigentlich funktionieren.
 
Leider nein...
funktioniert auch nicht...

Das war natürlich eine sehr Informative Aussage von mir... Sorry :D Hatte nur gerade eine Idee und hab es einfach abgeschickt...

Also ich bekomme die Fehlermeldung dass ich das übergebene Objekt nicht in eine CharCollection Casten darf! Dann fing er an rumzuheulen dass das new Object am falschen platz ist und es ließ sich gar nicht mehr Compiliern ^^ als ich dies entfernt habe, kam die erste Fehlermeldung wieder :D
 
So, ich habe die Methode nun so geschrieben jedoch mit char[] x...

Code:
//Vergleicht eine Sammlung mit einem anderen Objekt x. 
	//Liefert true, wenn x eine Sammlung mit den gleichen Buchstaben ist, 
	//und ansonsten false. Die Reihenfolge spielt keine Rolle.
	public boolean equals(char[] x){
		CharCollection others = new CharCollection();
		String tempstr = "";
		
		////////Zeichenfilter
		//Vergleiche den Char nach ASCII-Wert, ob es sich um einen Buchstaben handelt. Wenn JA dann lege den Buchstaben im 
		//Temporären String ab und erstelle eine neue Collection
		for(int i = 0; i < x.length;i++){
			if((int)x[i] > 64 && (int)x[i] < 91){
				tempstr = tempstr + x[i];
			}
		}
		others = new CharCollection(tempstr);
		//others ist nun eine vollwerte Buchstabensammlung
		
		//Passt die Menge der Zeichen beider Objekte nicht überein kann es
		//kann es keine Gleichheit geben!
		if(others.size() != size()){
			return false;
		}
		
		
		//Vergleiche alle Buchstaben miteinander und deren Anzahl. Bei einer Abweichung wird die Methode mit False beendet.
		for(int i = 0; i < others.size();i++){
			if(count(others.kette[i]) != others.count(others.kette[i])){
				return false;
			}
		}
		
		//System.out.println(x);
				
		
		return true;
	}

Zunächst muss ich die klammern und kommatas herrausfiltern. Denn die kann ich nicht gebrauchen. Das lege ich erst mal in einem String ab. Dann wird der String ein eine CharCollection geladen. Die Konstruktoren habe ich so aufgebaut dass sie mit Chars und Strings umgehen können. Der rest vergleicht dann nur noch.
Die Methoden size() und count() sind aus meiner Klasse.
size() gibt mir die Arraylänge (man kann also auch kette.length schreiben)
count(char c) zählt wie oft der übergebene Buchstabe vorhanden ist.
die Variable kette ist mein Array der Buchstabensammlung innerhalb der Klasse.

Nun muss ich nur noch das alles irgendwie in ein Object x bekommen ^^
 
welche Fehlermeldung ensteht genau bei dem Cast von Object nach charCollection, desweiteren, ist das ein Compilefehler, oder ein Runtimefehler?

der Cast sieht auch so aus bei dir?:
Java:
charCollection casted = (charCollection) o;
//das "new" hatte hier nix zu suchen, sorry
 
Zuletzt bearbeitet:
Also mit dem new "Token" wie Eclipse es nennt, geht es gar nicht...
Ohne kommt folgendes:

Exception in thread "main" java.lang.ClassCastException: [C cannot be cast to CharCollection
at CharCollection.equals(CharCollection.java:115)
at test.main(test.java:9)
 
Zurück