Vector mit contains abfragen

Status
Nicht offen für weitere Antworten.

ray30002

Mitglied
Moin allerseits... irgendwie komme ich hier nicht weiter, ich habe ein Vector mit Objekt der Klasse Buchstaben (enthaellt Character und int) und jetzt will ich ueber contains rausfinden, ob ein Object mit einem bestimmten Character als Wert enthalten ist... geht das?
 

Niki

Top Contributor
Ja, jedoch solltest du die equals und hashCode Methoden von der Klasse Buchstaben überschreiben
 
B

bygones

Gast
Niki hat gesagt.:
Ja, jedoch solltest du die equals und hashCode Methoden von der Klasse Buchstaben überschreiben
hashcode ist fuer die contains irrelevant - da wird nix gehasht...

equals reicht
 

ray30002

Mitglied
also ich nochmal, irgendwie sagen alle Quellen, welche ich im Internet finde, etwas anderes. Meine Klasse sieht folgendermasen aus:

Code:
	public BuchstabeMitAnzahl(Character c, int haeufigkeit) {
		this.c = c;
		this.haeufigkeit = haeufigkeit;
	}
	
	public Character getC() {
		return c;
	}
	public void setC(Character c) {
		this.c = c;
	}
	public int getHaeufigkeit() {
		return haeufigkeit;
	}
	public void setHaeufigkeit(int haeufigkeit) {
		this.haeufigkeit = haeufigkeit;
		
	}
Objekte dieser Klasse will ich in einen Vector schmeißen, und später überprüfen, ob in dem Vector ein Objekt dieser Klasse mit einem bestimmten Character vorhanden ist... tut mir leid, irgendwie stehe ich heute auf dem Schlauch.

Vielen Dank für die Hilfe
 
B

bygones

Gast
jaja - sollte man... dennoch ist die hashCode fuer contains irrelevant.

also...

damit es funktioniert - equals(Object o) ueberschreiben und true zurueckgeben wenn die objekte gleich sind (als zb gleicher Character und gleiche Haeufigkeit).

fuer den fleissheitspreis und eine stolzen brust alles blitzeblanko gemacht zu haben - auch noch die hashCode ueberschreiben
 

Murray

Top Contributor
Bei der geposteten Klasse kann man equals und hashCode nicht gleichzeitig a) korrekt im Sinne des Contracts dieser Methoden und b) für diesen Anwendungsfall sinnvoll implementieren.
 

tfa

Top Contributor
deathbyaclown hat gesagt.:
jaja - sollte man... dennoch ist die hashCode fuer contains irrelevant.

also...

damit es funktioniert - equals(Object o) ueberschreiben und true zurueckgeben wenn die objekte gleich sind (als zb gleicher Character und gleiche Haeufigkeit).

fuer den fleissheitspreis und eine stolzen brust alles blitzeblanko gemacht zu haben - auch noch die hashCode ueberschreiben

Das hat nichts mit Fleiß und Stolz zu tun. Wenn deine Klassen den Vertrag bezgl. equals und hashCode nicht einhalten, ist deine Software kaputt und du bekommst früher oder später Probleme. Punkt.

tfa
 

Niki

Top Contributor
Doch, du brauchst nur auf den Character überprüfen, da ich annehme dass es pro Buchstabe nur ein Objekt gibt.
 

tfa

Top Contributor
ray30002 hat gesagt.:
Geht also doch nicht?

Wenn wirklich nur die Buchstaben interessieren, könnte man die Aufrufe von hashCode und equals an
die entsprechenden Methoden von c delegieren, also

Code:
public int hashCode() {
    return c.hashCode()
}

equals entsprechend.
 

Murray

Top Contributor
Der Contract verlangt ja, dass hashCode für ein Objekt während seiner Lebensdauer immer den gleichen Wert liefert. Daher dürfen keine Attribute zur Berechnung verwendet werden, die sich während der Lebensdauer ändern können, weil es z.B. eine set-Methode gibt. Man sollte also besser den Buchstaben als final deklarieren und nur über einen Konstruktorparameter setzen.
 

Wildcard

Top Contributor
Nein, das stimmt so nicht.
Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified.
 

Leroy42

Top Contributor
Wildcard hat gesagt.:
Nein, das stimmt so nicht.
Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified.

Aber genau das (großgeschriebene) hat Murray doch behauptet? ???:L
 

Leroy42

Top Contributor
SlaterB hat gesagt.:
und das kleine Schwarze ist die Ausnahme ;)
Kann das mal jemand genau übersetzen?

Für mich heisst
provided no information used in equals comparisons on the object is modified.
==
ohne Informationen des equal-Vergleichs zu nutzen, wenn
das Objekt geändert wurde


Also, für mich heisst das doch genau dasselbe wie
Murray hat gesagt.:
...ein Objekt während seiner Lebensdauer immer den gleichen Wert liefert
 
S

SlaterB

Gast
...ein Objekt während seiner Lebensdauer immer den gleichen Wert liefert,
vorausgesetzt, bei equals ist es genauso (vorausgesetzt, keine Information, die in equals verwendet wird, wird geändert)

-> wenn equals die geänderten Infos berücksichtigt, dann darf und muss hashcode() das auch und andersrum
 

Marco13

Top Contributor
provided no information used in equals comparisons on the object is modified.
==
vorausgesetzt, dass keine Information, die in equals-Vergleichen des Objektes verwendet wird, wird geändert

Und das ist etwas anderes als
...ein Objekt während seiner Lebensdauer immer den gleichen Wert liefert

Ein Beispiel:
Code:
class Integer
{
    private int i;

    public void equals(Object other)
    {
        // cast, instanceof etc
       return this.i == otherInteger.i;
    }

    public int hashCode()
    {
        return i;
    }

    void set(int x)
    {
        this.i = x;
    }
}

Damit kann sich der Wert, der von hashCode geliefert wird, ändern. Allerdings hat sich dann auch "das, was das Objekt ausmacht" geändert, und wenn ein anderes Objekt vorher "equals" zum gegebenen Objekt war, ist es das nach der Änderung NICHT mehr. Damit ist der Vertrag also erfüllt.
 

Murray

Top Contributor
Sorry, war gefährliches Halbwissen; dieser Zusatz ist ja wohl mit "vorausgesetzt, dass sich zwischenzeitlich keine Merkmale verändert haben, die zur Ermittlung des Resultats der equals-Methode beitragen" zu übersetzen. Insofern darf sich der Hashcode also doch durchaus mit dem internen Zustand des Objekts ändern; auch bei der equals-Methode findet sich dieser Zusatz, dort allerdings mit Hinweis darauf, dass Änderungen an Objektmerkmalen nur dann zu Änderungen des equals-Vergleichs führen dürfen, sofern diese Merkmale auch zu einem veränderten Hashcode führen.
Insofern wäre ein von einem setzbaren Member abhängiger Hashcode wohl durchaus legitim.
 
S

SlaterB

Gast
dass das bei in Maps eingebetteten Objekten zu Katastrophen führt,
wird durch so einen Satz natürlcih nicht weggewischt ;)
 

Murray

Top Contributor
Zustandsabhängige Hashcodes erfüllen zwar den Contract der Klasse Object. Wenn man allerdings den Hashcode eines Objekts verwendet, um darüber das Objekt später wiederzufinden, gibt es Probleme: wenn ich ein Objekt als Key beim Einfügen in eine Hashmap verwende, ist es möglich, dass ich mit dem gleichen Objekt später bei get kein Ergebnis bekomme, wenn sich zwischenzeitlich der Zustand geändert hat. Daher können solche über die Lebensdauer des Objekts variable Hashcodes u.U. zu schwer zu findenden Fehlern führen.
 

tfa

Top Contributor
ray30002 hat gesagt.:
Joaaahhh... gut :) Oehmmm ich mach dat dann ma so irgendwie... :)

Wenn jeder Buchstabe in deinem Vector nur einmal auftreten kann, nimm lieber eine HashMap statt eines
Vector. Das könnte die Sache beschleunigen.
 

Leroy42

Top Contributor
tfa hat gesagt.:
Wenn jeder Buchstabe in deinem Vector nur einmal auftreten kann, nimm lieber eine HashMap statt eines
Vector. Das könnte die Sache beschleunigen.

Richtig! HashMap ist bei solchen Aufgabenstellungen
auf jeden Fall die adäquatere Datenstruktur.
 

Murray

Top Contributor
Wenn es um die Häufigkeiten von Buchstaben in ASCII-Texten geht, dann ist vielleicht ein int[] mit den Buchstaben als Indizes noch einfacher:
Code:
int [] haeufigkeit = new int[256];
for ( char c : text.toCharArray()) haeufigkeit[c] += 1;
 

Triebi

Aktives Mitglied
Marco13 hat gesagt.:
provided no information used in equals comparisons on the object is modified.
==
vorausgesetzt, dass keine Information, die in equals-Vergleichen des Objektes verwendet wird, wird geändert
Und das ist etwas anderes als
...ein Objekt während seiner Lebensdauer immer den gleichen Wert liefert[/qoute]

Ich muss sagen, dass hier gerade mein Weltbild schwankt.
Allerdings ist dein Beispiel nicht vollständig, Ich habe es mal ausforumuliert
Code:
public class MutableInt {
    private int i;

    public MutableInt(int value) { i = value; }

    public int get() { return i; }

    public void set(int i) { this.i = i; }

    @Override public boolean equals(Object other) {
		if (other instanceof MutableInt) {
			MutableInt otherInteger = (MutableInt)other;
			return this.i == otherInteger.i;
		}
		return false;
    }

    @Override public int hashCode() { return i; }

    @Override public String toString() { return this.getClass().getName() + "[value=" + get() + ']'; }
}
und ein HashSet damit gefüttert:
Code:
import java.util.HashSet;
public class MutIntTest {
	private static MutableInt m1 = new MutableInt(1);
	private static MutableInt m2 = new MutableInt(2);
	private static MutableInt m3 = new MutableInt(1);
	private static HashSet<MutableInt> set = new HashSet<MutableInt>();
	
	public static void main(String[] args) {
		set.add(m1);
		System.out.println("-------------- Vorher ---------------");
		print();
		
		m1.set(2);
		System.out.println("-------------- Nachher ---------------");
		print();
		
		System.out.println("-------------- Inhalt vom Set ---------------");
		for (MutableInt m : set) {
			System.out.println("m.equals(m1)\t" + m.equals(m1));
			System.out.println("m.equals(m2)\t" + m.equals(m2));
			System.out.println("m.equals(m3)\t" + m.equals(m3));
			System.out.println("\t" + m + "\tHash: " + m.hashCode() + "\tim Set: " + set.contains(m));
			
		}
	}
	
	private static void print() {
		System.out.println("m1.equals(m2)\t" + m1.equals(m2));
		System.out.println("m1.equals(m3)\t" + m1.equals(m3));
		System.out.println("m2.equals(m3)\t" + m2.equals(m3));
		System.out.println("#1\t" + m1 + "\tHash: " + m1.hashCode() + "\tim Set: " + set.contains(m1));
		System.out.println("#2\t" + m2 + "\tHash: " + m2.hashCode() + "\tim Set: " + set.contains(m2));
		System.out.println("#3\t" + m3 + "\tHash: " + m3.hashCode() + "\tim Set: " + set.contains(m3));
		System.out.println();
	}
}
Teste es und sage mir, was du davon hältst.

[...]Damit ist der Vertrag also erfüllt.
Vielleicht auf dem Papier. In der Praxis halte ich es jedoch nach wie vor für gefährlich, equals/hashCode und Veränderlichkeit zu kombinieren.
 

Marco13

Top Contributor
Den hashwert eines Objektes zu verändern, WÄHREND es in einem HashSet liegt, ist natürlich der Killer. Das darf man nicht machen. Wie soll die HashSet denn etwas von der Änderung mitbekommen? Das Objekt, das danach im HashSet liegt, ist (aus Sicht des HashSets) einfach nichtmehr das gleiche wie vorher!

So funktioniert es natürlich:
Code:
....
      set.add(m1);
      System.out.println("-------------- Vorher ---------------");
      print();

      set.remove(m1); // !!!
      m1.set(2);
      set.add(m1); // !!!

      System.out.println("-------------- Nachher ---------------");
      print();

EDIT: Als Nachtrag: Es ist nicht "gefährlicher" als anderes. Wenn du z.B. eine Liste von Personen nach ihrem Vornamen sortierst, und nachher den Vornamen einer Person änderst, ist die Liste danach natürlich nichtmehr unbedingt sortiert - das ist genau das gleiche.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Datentypen Probleme mit Vector.contains() Java Basics - Anfänger-Themen 10
J Erste Schritte Alle möglichen ausgaben von 5 Zahlen als Vector Java Basics - Anfänger-Themen 7
C Werte im Vector in zufällige Reihenfolge bringen Java Basics - Anfänger-Themen 14
C Vector-Inhalt in zufällige Reihenfolge bringen Java Basics - Anfänger-Themen 6
J Compiler-Fehler Fehler bei Vektor (E extends Object declared in class Vector) Java Basics - Anfänger-Themen 9
J Reihenfolge im Vector lässt sich nicht drehen Java Basics - Anfänger-Themen 9
M Klassen Gesamt speicherbare Elemente in Vector? Java Basics - Anfänger-Themen 3
P Vector durchsuchen und Elemente löschen Java Basics - Anfänger-Themen 4
Z Vector in jTextField/jLabel darstellen Java Basics - Anfänger-Themen 4
P Objekte in Vector werden überschrieben Java Basics - Anfänger-Themen 4
P Array in Vector speichern Java Basics - Anfänger-Themen 2
E Methoden new Vector().add(x).add(x); ? Java Basics - Anfänger-Themen 5
F Vector istGeordnet Java Basics - Anfänger-Themen 15
R Vector-Filterfunktion Java Basics - Anfänger-Themen 4
Todesbote Map (Key=String; Value = Vector) Value/Vector sortieren Java Basics - Anfänger-Themen 13
J Vector Manipulieren.. Wie? Java Basics - Anfänger-Themen 16
M Vector eines Vectors einzeln ausgeben Java Basics - Anfänger-Themen 9
K String kommt schon in Vector vor? Java Basics - Anfänger-Themen 36
J Erzeugung eines Vector-Objekts - Frage zum Typ Java Basics - Anfänger-Themen 3
H Zugriff auf Vector Element Java Basics - Anfänger-Themen 2
C Vector erzeugt neue Indizes nach Input Java Basics - Anfänger-Themen 2
A Author in Vector Java Basics - Anfänger-Themen 22
M Vector überschreibt Elemente bei add()-Methode Java Basics - Anfänger-Themen 10
T Elemente im Vector werden einfach überschrieben! Java Basics - Anfänger-Themen 3
K Collections Vector zu String casten Java Basics - Anfänger-Themen 4
U Wozu dient ein Vector in Java? Java Basics - Anfänger-Themen 6
S Vector mit beliebigen Klassen an Funktion übergeben Java Basics - Anfänger-Themen 20
B Globale vector? Java Basics - Anfänger-Themen 7
E 2 Dimensionaler Vector Java Basics - Anfänger-Themen 5
T Map<String, Vector>? Java Basics - Anfänger-Themen 11
P Collections Vector füllen in for-Schleife Java Basics - Anfänger-Themen 3
J Vector Addition Java Basics - Anfänger-Themen 5
M 2D Vector Java Basics - Anfänger-Themen 2
N IndexOutOfBoundsException: Source does not fit in dest beim Kopieren von ArrayList in Vector Java Basics - Anfänger-Themen 4
M Umwandlung von Array in Vector und umgekehrt Java Basics - Anfänger-Themen 6
E Datentypen Klasse Vector aus der Standard-API anwenden Java Basics - Anfänger-Themen 7
D Klasse Vector entwerfen Java Basics - Anfänger-Themen 7
A Arrays vs Liste vs Vector Java Basics - Anfänger-Themen 30
H in for Schleife über Vector iterieren Java Basics - Anfänger-Themen 2
S Datentypen Vector auslesen Java Basics - Anfänger-Themen 12
yampi Objektsammlung - Hashtable, Vector, Arrays Java Basics - Anfänger-Themen 8
T Vector-Positin anzeigen Java Basics - Anfänger-Themen 3
C Vector - obsolete collection Java Basics - Anfänger-Themen 1
C Vector<Object> Probleme Java Basics - Anfänger-Themen 38
M Datentypen function(Vector<SuperClass>), Vector<Subclass> Java Basics - Anfänger-Themen 6
L Vector Sortieren Java Basics - Anfänger-Themen 8
B Vector in Table ersetzen Java Basics - Anfänger-Themen 4
B Werte einer Spalte aus DB in einen Vector schreiben Java Basics - Anfänger-Themen 15
kitz Telefonbuch (Vector) Java Basics - Anfänger-Themen 17
E Arraylist mit Daten aus Vector füllen Java Basics - Anfänger-Themen 7
S Vector -> String JComboBox Java Basics - Anfänger-Themen 11
F Vector wird überschrieben Java Basics - Anfänger-Themen 8
T Vector sortiern Java Basics - Anfänger-Themen 7
C Frage zu Vector und muliplizieren des Inhaltes Java Basics - Anfänger-Themen 2
S Vector von eigenen Klassen Java Basics - Anfänger-Themen 2
J Collection Vector Java Basics - Anfänger-Themen 8
Streeber ArrayList/Vector, mehrdimensional Java Basics - Anfänger-Themen 11
N Was ist der Unterschied zwischen ArrayList und Vector? Java Basics - Anfänger-Themen 3
babel Einen Vector/Liste mit Daten prüfen Java Basics - Anfänger-Themen 31
B Hilfe zum einem Problem mit Vector Java Basics - Anfänger-Themen 8
H Vector - Fehler? Java Basics - Anfänger-Themen 2
babel einen Vector nach Datum sortieren Java Basics - Anfänger-Themen 21
T Array-Vector Problem Java Basics - Anfänger-Themen 18
P Vector und Exception Java Basics - Anfänger-Themen 7
K Vector Java Basics - Anfänger-Themen 3
K Vector Java Basics - Anfänger-Themen 10
babel ein Vector mit verschiedenen Werten auslesen und berechnen Java Basics - Anfänger-Themen 34
T Object aus Vector übergeben Java Basics - Anfänger-Themen 2
B Vector<Point> als Rückgabewert Java Basics - Anfänger-Themen 23
L Vector einem Array hinzufügen Java Basics - Anfänger-Themen 14
P Vector mit double Java Basics - Anfänger-Themen 3
P Vector Elemente auslesen Java Basics - Anfänger-Themen 9
N Anfängerfrage richtige Syntax und Frage zu Vector Java Basics - Anfänger-Themen 7
C Unterschied zwischen ArrayList und Vector Java Basics - Anfänger-Themen 2
W Vector mit String[] auslesen Java Basics - Anfänger-Themen 4
Povlsen84 Initlialisierung, Vector, serialVersionUID . kleine Fragen Java Basics - Anfänger-Themen 4
Q Vector verändert trotz final seine Größe Java Basics - Anfänger-Themen 5
B Dopplete aus Vector entfernen Java Basics - Anfänger-Themen 8
E Vector Fehler bei allen Methoden von Vector Java Basics - Anfänger-Themen 2
K Vector zu Array machen Java Basics - Anfänger-Themen 10
1 JList Problem : Synchronisation mit Vector klappt nicht :( Java Basics - Anfänger-Themen 6
L Multidimensional Vector - Recordset Java Basics - Anfänger-Themen 5
K Objektklasse mit leerem Vector füllen Java Basics - Anfänger-Themen 6
K Vector wird überschrieben Java Basics - Anfänger-Themen 7
G Vector Strijng parsen Java Basics - Anfänger-Themen 6
K vector cannot be resolved Java Basics - Anfänger-Themen 3
G Zeichenkette suchen in Vector-Klasse Java Basics - Anfänger-Themen 11
R fehler beim incrementellen schreiben in einen vector Java Basics - Anfänger-Themen 11
M ObjectInputStream, Object und Vector<Object> Java Basics - Anfänger-Themen 4
G Vector, equal & Casts Java Basics - Anfänger-Themen 5
N Objekte in einen Vector packen oder nicht? Java Basics - Anfänger-Themen 3
D Frage zu Vector Java Basics - Anfänger-Themen 7
S Problem mit Vector Java Basics - Anfänger-Themen 2
G Object[] [] nach vector casten. Java Basics - Anfänger-Themen 3
G 2D vector zugriff auf elementinterne elemente wie Java Basics - Anfänger-Themen 3
G vector in neuem vector sortieren Java Basics - Anfänger-Themen 3
G jede 2te zeile in vector leer einfügen, wie? Java Basics - Anfänger-Themen 4
G vector füllt sich immer weiter. wo muss ich ihn leeren? Java Basics - Anfänger-Themen 3
V Vector/Arraylist hat nur gleiche Einträge Java Basics - Anfänger-Themen 3
G Vector eigenen Typs mit Daten füllen Java Basics - Anfänger-Themen 20

Ähnliche Java Themen

Neue Themen


Oben