Dupplikate aus Collections entfernen

schnuffie

Erfahrenes Mitglied
Hallo Leute,

aufgrund eines Performance-Problems mußte ich mir Gedanken machen, wie ich statt dem Durchlaufen einer Schleife mit natürlich wesentlich mehr Einträgen, aus dem Array die doppelten Einträge einfacher entfernen kann.

Die Lösung könnte sicherlich auch andere interessieren:

Code:
String[] as = {"Heinz", "Fritz", "Heinz", "Karl", "Fritz"};
Set set = new HashSet(Arrays.asList(as));
as = (String[])set.toArray(new String[]);
 
Bist Du auf ein Array angewiesen? Ich denke, wenn Du von vornherein eine Collection (eine Richtige, z. Bsp. nen Vector) nehmen würdest könntest Du ganz einfach vor dem hinzufügen mit Contains abfragen, ob es das entsprechende Objekt schon innerhalb der Collection gibt. (http://java.sun.com/j2se/1.5.0/docs/api/java/util/Collection.html#contains(java.lang.Object))

Nur mal so als Überlegung...
 
Ja, man könnte denken, ich würde den Wald vor lauter Bäumen nicht sehen.:)

Nichts für ungut, aber ich bin auf eine Schnittstelle zu einem Altsystem angewiesen, das mir den Array liefert (übrigends Comparable, also könnten auch Integer darunter sein).
 
Cham, Du hast mich dennoch auf einen Gedanken gebracht!

Ich hab' mein Projekt (neuer Programmanteil) umgebaut und eine definierte Schnittstelle eingebaut, damit ich selbst mit einer Collection arbeiten kann:

Code:
public interface DataTransformer {
 
public Set toSet(Comparable[] inputArray);
 
public Comparable[] toComparable(Collection outputCol);
 
//noch andere Methoden
 
}
 
Hallo!

Das wird so u.U. nicht funktionieren.

Du kannst kein Comparable[] auf einen String[] casten. Da musst du dir einen Workaround einfallen lassen.

Gruß Tom
 
Zuletzt bearbeitet:
Wieso nicht Tom?

Code:
public final class String extends Object implements Serializable, Comparable, CharSequence

Code:
Set set = new HashSet(Arrays.asList(array));
 
Comparable[] ac = (Comparable[])set.toArray(new Comparable[]);
 
Zuletzt bearbeitet:
Hallo!

Meine du wolltest sowas machen:
Code:
public class CastExample {
	public static void main(String[] args){
		Comparable[] oA = {"a","b","c"};
		String[] sA = (String[])oA;
		System.out.println("wirft vorher eine Exception...");
	}
}

Weiterhin muss du bei deinem Beispiel im:
Code:
Comparable[] oA = { "a", "b", "c" };
		Set set = new TreeSet(Arrays.asList(oA));

		Comparable[] ac = (Comparable[]) set.toArray(new Comparable[0]);

		System.out.println(Arrays.asList(ac));

beim toArray(...) Aufruf die Dimension beim Array mitgeben, (auch wenn diese 0 ist);

Gruß Tom
 
Zuletzt bearbeitet:
Mit der "toArray(...)"-Methode hast Du natürlich recht.

Ich habe das Beispiel (= funktionsfähig) mal angehängt.

Interessant finde ich, daß das Float- und Integer-Objekt (jeweils mit Inhalt 8) ungleich sind, denn im Set werden beide gespeichert. Ein primitiver Datenvergleich zwischen 8 und 8.0 ist stets gleich. Wer weiß, wie die equals(...)-Methode implementiert ist...;-)

Code:
System.out.println((new Float(8.0)).equals(new Integer(8))); //= false
System.out.println((new Float(8.0)).equals(new Float(8))); //= true
System.out.println(8.0f == 8f); //=true
System.out.println(((int)8.0f) == 8); //=true
 

Anhänge

Zurück