# Vector gleiche elemente entfernen



## javaxy (25. Juni 2007)

Ich möchte aus einem Vector identische Elementen suchen und diese dann nach dem Datum vergleichen und die älteren Elemente aus der Vector wieder entfernen.

wie geht das

Danke schonmal

es ist dazu noch zu sagen das der Vector aus anderen Vektoren besteht

Noch eine Andere Frage wie greife ich auf die Elemente eines Vectors zu der wiederrum in einem Vector steckt?

Bin für jede Hilfe dankbar!


----------



## Kulabac (25. Juni 2007)

Also wenn du in den Vectoren ein Datum speicherst, sind sie schonmal nicht identisch ... die Elemente bekommen beim hinzufügen nicht automatisch einen Timestamp mit.

Der Zugriff ist eigentlich ganz einfach. Sowas wie vector1.elementAt(i).elementAt(j) sollte eigentlich immer gehen. Wenn die Vectoren nicht typisiert sind halt noch mit nem Cast dazwischen.

Also nochmal:

Du hast einen Vector. Der Vector enthält eine beliebige Anzahl an weiteren Vectoren. Was willst du jetzt löschen? Einige der Vectoren aus dem Hauptvector oder Elemente aus den anderen Vectoren oder ... ?


----------



## javaxy (25. Juni 2007)

Ja genau vielen Dank für die Antwort!

Also stell dir vor du hast 20 Vectoren die immer ähnlich Aufgebaut sind wie 
für eine Tabelle der Vector stellt ja soz. einen Datensatz da! darunter ist auch eine Datumsangabe!

Nun möchte ich diese 20 vectoren an der Stelle 2 vergleichen (an stelle 2 sind Zahlen drin)
diese Zahlen kommen manchmal doppelt vor! Wenn ein solcher Doppeleintrag in Spalte 2 gefunden wird sollen die beiden Vectoren nun das Datum vergleichen!  Der Datumsmäsig ältere der beiden soll dann komplett aus dem Hauptvektor gelöscht werden.
Es ist halt wichtig dass ein Vector einen zusammengehörenden Datensatz darstellt und die Werte müssen eben zusammen bleiben! 

 Ich hoffe ich konnte das einbischen erklären!
Und ihr versteht was ich meine!

Wie kann ich jetzt die Zahlen miteinander vergleichen? Das ist schon mal ein Problem 

bin für jede Hilfe dankbar!


----------



## Kulabac (25. Juni 2007)

Hmm ... ok. Ich hab gerade mal was zusammengebastelt, aber keine Ahnung ob's funktioniert. Ich bin jetzt davon ausgegangen, dass an Position 0 das Datum steht (dazu hattest du nichts gesagt, wo es ist). Und ist wie gesagt nicht getestet 


```
private Vector <Vector> vector1 = new Vector <Vector>();
	
	public void vergleichen() {
		for (int i = 0; i < vector1.size(); i++)
			for (int j = i; j < vector1.size(); j++) {
				if ((((Integer)vector1.elementAt(i).elementAt(2)) == ((Integer)vector1.elementAt(j).elementAt(2))) && (i != j)) {
					if (((Date)vector1.elementAt(i).elementAt(0)).before((Date)vector1.elementAt(j).elementAt(0))) {
						vector1.removeElementAt(i);
						i--; j--;
						break;
					}
					else {
						vector1.removeElementAt(j);
						i--; j--;
						break;
					}
				}
			}
	}
```

Was ich mache ist folgendes: Ich schau mir von einem Element die Position 2 an und vergleiche dann mit der Position 2 von allen Nachfolgevectoren. Wenn irgendwo die gleiche Zahl gefunden wird, wird einer von beiden gelöscht und die innere Schleife verlassen. Theoretisch könnte es so funktionieren ...


----------



## javaxy (25. Juni 2007)

hey danke das Programm ist sehr gut ! es funktioniert auch soweit! 

Frage kann man in der ersten If schleife  den vergleich mit equals durchführen müsste doch genauso gehen das gleiche sein wie == oder gibt es da nen unterschied?
Weil mit equals gehts
mit == aber nicht ! Woran liegt das?

Andere Frage leider ist das Datum bei mir als String gespeichert gibt es eine möglichkeit die in ein Date umzuwandeln oder anders das Datum vergleichen 

Wär für noch ne Hilfe sehr sehr dankbar!

Danke für so ne tolle Hilfe bisher


----------



## javaxy (25. Juni 2007)

Hi Kulabac

kannst du mir verraten wie du die Vectoren castest? Oben steht ja <Vector> vektor1

und dann unten (Integer)vektor1

ist das so überhaupt zulässing mein Vektor ist nicht gecastet kann ich dann trotzdem das Datum vergleichen!

Danke schon mal


----------



## limago (25. Juni 2007)

Hi,

irgendwie verstehe ich nicht was Ihr hier treibt. Der Vector im Vector repräsentiert doch einen Datensatz, oder? Warum nicht dafür (wie es sich gehört) eine Klasse mit Gettern und Settern anlegen. Eine Compare-Methode wäre auch nicht schlecht. Der Code wäre stabiler und leichter zu lesen.

Wenn Du dann noch den äußeren Vector beerbst und als Fliegengewicht implementierst, kommen Duplikate gar nicht erst rein. 

Mit einem Hash statt dem Vector kann man das Problem sicher auch sehr elegant lösen.

Grüße


----------



## Kulabac (26. Juni 2007)

Also soweit ich das verstanden hab geht's um eine Tabelle. Natürlich kann man sich dafür ein eigenes Table-Modell schreiben usw. Aber mit zwei Vectoren, einen für die Spaltenüberschriften und einen für die Daten geht's halt mit weniger Aufwand und dafür ist eine mögliche Lösung halt der Vector mit den einzelnen Vectoren für die Zeilen.

Ich caste nicht den Vector an sich. Also oben leg in den Vector so an, dass er nur Vectoren enthält. Der Vorteil dabei ist, dass ich halt das vector1.elementAt(i).elementAt(j) machen kann und nicht ((Vector)vector1.elementAt(i)).elementAt(j) machen muss.

Unten Caste ich das elementAt(2) bzw elementAt(0) nach Integer bzw. Date (nicht den vector1). Das sollte eigentlich funktionieren. Warum da der Vergleich schief geht, weiß ich allerdings so auch nicht. Vielleicht ein Klammerfehler ... aber wenn's mit equals klappt, lass es so 

Wenn du ohne Cast vergleichst, vergleichst du nur Objects, nicht Date oder sonst was. Teste es aus, wenn's funktioniert super ... wenn nicht caste halt


----------



## limago (26. Juni 2007)

Hier mal eine Lösung aus einem andern Thread. Ich habe nur den Test auf Duplikate eingebaut. Der Observer ist nur zur Benachrichtung bei Änderungen und kann weggelassen werden.

"Innerer Vector"

```
package de.tutorials.tiere;

import java.util.Observable;

public class Schwein extends Observable{
	
	private String name;
	private int gewicht;
	
	public Schwein() {
		this("nobody");
	}
	
	public Schwein(String name) {
		setName(name);
		setGewicht(10);
	}

	public int getGewicht() {
		return gewicht;
	}

	private void setGewicht(int gewicht) {
		this.gewicht = gewicht;
		fireEvent();
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
		fireEvent();
	}
	
	public void fressen() {
		setGewicht(getGewicht() + 1);
	}

	@Override
	public String toString() {
		
		return "Schwein [Name="+getName()+", Gewicht=" + getGewicht() + "]";
	}
	
	private void fireEvent() {
		setChanged();
		notifyObservers();
	}
	
	
	

}
```

"Äußerer Vector"

```
package de.tutorials.tiere;

import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;

public class SchweineModel extends Observable implements Observer{

	private List<Schwein> schweine = new ArrayList<Schwein>();
	
	public void add(Schwein e) {
		
		// Duplikate (gleichnamige Schweine) entfernen
		for(Schwein s : schweine) {
			if (s.getName().equals(e.getName())){ 
				remove(s);
				break;
			}
		}
		e.addObserver(this);
		schweine.add(e);
		fireEvent();
	}

	public void clear() {
		for(Schwein schwein: schweine)
			schwein.deleteObserver(this);
		schweine.clear();
		fireEvent();
	}

	public void remove(Schwein o) {
		o.deleteObserver(this);
		schweine.remove(o);
		fireEvent();
	}

	public Object[] toArray() {
		return schweine.toArray();
	}

	public void update(Observable o, Object arg) {
		fireEvent();
		
	}
 
	private void fireEvent() {
		setChanged();
		notifyObservers();
	}
	

}
```


----------



## javaxy (26. Juni 2007)

vielen Dank für die Antworten

hat soweit mit den verschachtelten For Schleifen super geklappt!

Ich hät da noch ne Fragen und zwar.

Vector  testVec = (Vector) (new Vector ( (tableVec).elementAt(k)).elementAt(2) );

wollte ich gerne aus dem Hauptvector den Untervector an der Stelle 2 in einen anderen Hilfs vektor schreiben nur leider klappt das nicht da kommt immer die Fehlermeldung

 java.lang.ClassCastException: java.util.HashSet cannot be cast to java.util.Vector

Offensichtlich kann das HashSet im Untervektor nicht gecastet werden wie bekomme ich jetzt trotzdem die Daten in einen Vector

Hoffe ihr versteht was ich meine 

Danke


----------



## zerix (27. Juni 2007)

Hallo,

das man ein HashSet oder auch eine HashMap nicht in einen Vector casten kann ist klar.

Du kannst aber einem Vector im Konstruktor eine Collection übergeben, also unter anderem ein HashSet und so hast du dann die Daten im Vector stehen.

MFG

zEriX


----------

