Collections Wahl der richtigen Collection

G

Gust

Gast
Hallo zusammen,

ich bin auf der Suche nach einer Collection, die folgendes kann:
1. jedes Element darf nur einmal vorkommen
2. die Elemente sollen automatisch (und immer) sortiert sein
3. ich will wie bei einer List über den Index zugreifen können

Die naive Lösung wäre natürlich sowas hier:
Java:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;


public class SpecialList<T extends Comparable<T>> {

	private List<T> list = new ArrayList<T>();
	
	public void add (T element){
		if(!list.contains(element)){
			list.add(element);
			Collections.sort(list);
		}
	}
	
	//ein paar weitere delegations hier ...
}
.. was natürlich ziemlich "lame" ist.
Mir ist bewusst, dass es java.util.TreeSet gibt, was zumindest Anforderungen 1 und 2 erfüllt. Man kann aber nur über nen Iterator zugreifen. Ich könnte natürlich erben und die Methode get(int index) hinzufügen, aber das wäre ja genauso hässlich :(
Also habt ihr eine Idee, welche Collection dafür in Frage käme? Ich habe das java.util Package durchsucht, aber habe beim besten Willen nichts Passendes gefunden.
 
G

Gast2

Gast
1. jedes Element darf nur einmal vorkommen
2. die Elemente sollen automatisch (und immer) sortiert sein
TreeSet wie du selbst schon gesagt hast.

3. ich will wie bei einer List über den Index zugreifen können
Du kannst ne List erzeugen und die mit den Daten des Sets füttern. Dann hast du die Möglichkeit per index draufzuzugreifen.
Je nachdem wie oft du das brauchst ist die Lösung nicht so toll ;)
 

Landei

Top Contributor
Das [c]add[/c] oben ist wirklich ziemlich lahm, aber man könnte es besser machen: Per binärer Suche den Einfügeindex finden, schauen, ob da schon das Element steht, das man einfügen will, und wenn nicht, dann einfügen.
 
Zuletzt bearbeitet:
G

Gust

Gast
Ok, die Lösung mit der binären Suche ist eine Idee. Aber ich komme mir immer doof vor, wenn ich Collections nachimplementieren muss. Ist meine Anforderung denn so ungewöhnlich, oder warum gibt es da nichts Passendes?
 

Landei

Top Contributor
Sortierung und indizierter Zugriff sind nicht ohne weiteres unter einen Hut zu bringen. Bei den meisten Algorithmen ist klar, was benötigt wird, am häufigsten eben ein (eventuell sortierstes) Set, eine Liste, eine Map, eine (z.B. Priority-) Queue oder ein Stack. Auch bei Google Guava (früher u.a. "Google Collections") scheint es deine gewünschte Kombination nicht zu geben.
 

Gregorrr

Bekanntes Mitglied
Ok, die Lösung mit der binären Suche ist eine Idee. Aber ich komme mir immer doof vor, wenn ich Collections nachimplementieren muss. Ist meine Anforderung denn so ungewöhnlich, oder warum gibt es da nichts Passendes?

Was ist denn dein Problem mit EikeB Vorschlag?

Wie Landei komplett richtig sagt, beides sind orthogonale Konzepte, d.h. hier muss man einen Kompromiss schließen, was man lieber haben möchte.

Wobei ich mir Gedanken machen würde, wenn die TreeSet Implementierung wirkliche Performance-Probleme verursachen würde.
 

Marco13

Top Contributor
Ungewöhnlich nicht, sowas braucht man schon ab und zu mal. Allerdings braucht man die spezifische Kombination relativ selten. Man könnte sagen, dass es eine handvoll Operationen gibt, die Collections können
add, remove, find (bzw. contains), get(int index)
und dazu orthogonale Eingeschaften wie "Jedes Element nur einmal drin", oder "Immer sortiert". Die Operationen sollten natürlich möglichst kleine Laufzeit haben, am besten alle O(1) oder schlimmstenfalls O(logn). Aber das kann man nicht alles auf einmal erreichen, und welche Implementierung die beste ist, hängt dann davon ab, welche Operationen besonders oft ausgeführt werden. Als Beispiel:
(ich sehe gerade, dass das bisherige auch schon andere geschrieben haben... hätte wohl erstmal "Reload" drücken sollen :oops: )
Oben wurde gesagt: Bei 'add' eine Binäre suche machen, und ggf. einfügen. Wenn der überwiegende Anteil der Aufrufe darin besteht, dass man 'add' mit einem Element aufruft, das schon enthalten ist, wäre die binäre Suche vielleicht weniger gut. Stattdessen wäre ein O(1)-Zugriff (wie bei einem HashSet) dort besser. Dann wird der indizierte Zugriff lahm, aber vielleicht braucht man den ja nur "ganz selten" (und an nicht-zeitritischen Stellen)?

Zusätzlich hat man oft den Tradeoff zwischen Speicherverbrauch und Zugriffszeit. Eine Triviallösung wäre natürlich, eine Wrapper-Klasse zu machen, die intern eine List und eine HashSet speichert, und z.B. bei 'add' sowas macht wie
Java:
void add(Object object)
{
    boolean added = set.add(object);
    if (added) binaryInsertInto(list, object);
]
"Mischformen" wie irgendwelche "lazy"-Strukturen wären auch denkbar:
Java:
Object get(int index)
{
    if (list==null)
    {
        list = new ArrayList<Object>(set);
    }
    return list.get(index);
}
void add(Object object)
{
    set.add(object);
    list = null;
}
Aber das hängt alles von den Zugriffsmustern ab.


[/code]
 

Ark

Top Contributor
Aber das hängt alles von den Zugriffsmustern ab.
Genau das ist es, was ich hier nicht so ganz verstehe: In welchem Fall braucht man denn einen (echt) wahlfreien Zugriff per Index, aber gleichzeitig eine permanente Sortierung? Sobald ich ein Element einfüge, verschieben sich doch durch die Sortierung einige/alle Indices der bisher eingefügten Elemente, und damit bringen mir die Indices doch nichts mehr.

--> Ich wünsche mir gerade ein Beispiel, wo eine derartige Datenstruktur benötigt wird.

Ark
 

thinktank

Mitglied
Genau das ist es, was ich hier nicht so ganz verstehe: In welchem Fall braucht man denn einen (echt) wahlfreien Zugriff per Index, aber gleichzeitig eine permanente Sortierung? Sobald ich ein Element einfüge, verschieben sich doch durch die Sortierung einige/alle Indices der bisher eingefügten Elemente, und damit bringen mir die Indices doch nichts mehr.

--> Ich wünsche mir gerade ein Beispiel, wo eine derartige Datenstruktur benötigt wird.

Ark

Nur der Vollständigkeit halber, weil ich gerade das gleiche "Problem" habe: Ein Beispiel ist ein zeitlich sortierter TreeSet aus OHLC Bars, von denen ich über die letzten 200 einen Durchschnitt bilden will. Dann will ich von (size - x) bis (size) loopen und irgendwas berechnen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Programmierrichtlinie enthält Leitlinien und Regeln für die Wahl von Bezeichnern von Routinen.. Java Basics - Anfänger-Themen 8
H Java-Editor Wahl Java Basics - Anfänger-Themen 15
G Wahl zwischen Typklassen Java Basics - Anfänger-Themen 3
1 Wahl der Datenstruktur für die Suche. Java Basics - Anfänger-Themen 9
G Wahl fuer die Highscoreliste Java Basics - Anfänger-Themen 9
M Von Eclipse zum richtigen Programm Java Basics - Anfänger-Themen 1
E fehlermeldung bei richtigen login daten Java Basics - Anfänger-Themen 7
HeiTim Problem mit der Kommasetzung an der richtigen stelle Java Basics - Anfänger-Themen 59
CptK Richtigen Pfad beim einlesen von Datei finden Java Basics - Anfänger-Themen 2
MiMa Die richtigen Java Projektvorlagen wählen? Java Basics - Anfänger-Themen 3
F actionPerformed() zur richtigen Zeit Java Basics - Anfänger-Themen 6
Ponychan95 Kommazahl als richtigen Währungsbetrag ausgeben Java Basics - Anfänger-Themen 1
K Methoden Lotto mit sechs richtigen Java Basics - Anfänger-Themen 10
T Richtigen Wert erkennen Java Basics - Anfänger-Themen 9
S Suche richtigen Typ für Variabel mit den Werten (neu, gebraucht, beschädigt) Java Basics - Anfänger-Themen 7
D Erste Schritte Auswahl der richtigen tools Java Basics - Anfänger-Themen 7
D Muss ich eigentlich immer auf die Verwendung des richtigen Datentyps achten? Java Basics - Anfänger-Themen 7
A Framegröße nur in richtigen Proportionen ändern Java Basics - Anfänger-Themen 2
Z Frage des richtigen Werkzeugs für ein Schachspiel? Java Basics - Anfänger-Themen 32
T ArrayList mit Dateien in die richtigen Ordner eines JTree Java Basics - Anfänger-Themen 16
J Richtigen Parser wählen Java Basics - Anfänger-Themen 2
D Wie kann ich den richtigen Parameter übergeben Java Basics - Anfänger-Themen 5
Encera Garbage Collection Java Basics - Anfänger-Themen 9
U Beispiel Methode size() vom "Collection"-interface... Wie kann man sichtbar machen, was die Methode unter der Haube macht? Java Basics - Anfänger-Themen 8
berserkerdq2 Warum soll ich shuffle nutzen, um bei Rückgabewert Collection eine Liste zurückzugeben? Java Basics - Anfänger-Themen 3
M Collection.sort sortiert nicht Java Basics - Anfänger-Themen 7
D public ArrayList(Collection<? extends E> c); Java Basics - Anfänger-Themen 2
O Verwirrt beim Java Collection Framework aufruf! Java Basics - Anfänger-Themen 9
T Collections Geeignete Collection/Liste/Datenbank Java Basics - Anfänger-Themen 17
E Interface List nicht als Collection an erkannt. Java Basics - Anfänger-Themen 14
F Collection Aufgabe mit LinkedList Java Basics - Anfänger-Themen 3
N Collections Werte aus .txt in einer Collection speichern Java Basics - Anfänger-Themen 11
M Collection Aufgabe Java Basics - Anfänger-Themen 22
Arif Collections Unkonstruiertes Objekt einer Collection hinzufügen Java Basics - Anfänger-Themen 2
W Collection-Problem Java Basics - Anfänger-Themen 35
P Klassen In einer Autoklasse das Objekt Auto mittels Collection Speichern Java Basics - Anfänger-Themen 4
N Collection sortieren/ filtern Java Basics - Anfänger-Themen 7
K Collections Zugriff auf ein bestimmtes Element in der Collection Java Basics - Anfänger-Themen 1
J Objekt in Collection speichern Java Basics - Anfänger-Themen 4
A Interface in Collection (Liste) angeben Java Basics - Anfänger-Themen 2
J Collection Objekt Java Basics - Anfänger-Themen 3
T Collections Zusammengehörende Strings in einer Collection Java Basics - Anfänger-Themen 2
S Frage zu Collection-Generics in Subklassen Java Basics - Anfänger-Themen 6
B Collections Collection soll nur einen bestimmten Datentyp aufnehmen Java Basics - Anfänger-Themen 12
B addAll(Collection<? extends E> c) Java Basics - Anfänger-Themen 9
K Collections Collection für 12 mio Strings Java Basics - Anfänger-Themen 7
Y Collection der eigenen Klasse Java Basics - Anfänger-Themen 10
S Collections Welche Collection ist am geeignetsten? Java Basics - Anfänger-Themen 3
R Passende Collection gesucht Java Basics - Anfänger-Themen 11
O Frage zu Verständnis von Collection Java Basics - Anfänger-Themen 4
D Scala Iterable zu Java Collection konvertieren Java Basics - Anfänger-Themen 3
D Frage zu Collection und deren Anwendung Java Basics - Anfänger-Themen 2
S Welche Collection kann sich selber sortieren? Java Basics - Anfänger-Themen 8
J Collection soll übergeben werden... Java Basics - Anfänger-Themen 7
C Vector - obsolete collection Java Basics - Anfänger-Themen 1
B Iterator und Collection Java Basics - Anfänger-Themen 11
G Java Collection Frameworks Java Basics - Anfänger-Themen 5
D Collection Konvertieren Java Basics - Anfänger-Themen 7
K Datentypen Über Collection iterieren bringt fehler Java Basics - Anfänger-Themen 8
K OOP Aus Collection Objekte bestimmter Subklassen entfernen Java Basics - Anfänger-Themen 7
S Welche Collection? Java Basics - Anfänger-Themen 5
S Collection rückwärts durchsuchen Java Basics - Anfänger-Themen 4
W Wie kann ich auf Object meiner Collection zugreifen Java Basics - Anfänger-Themen 7
J Collection Vector Java Basics - Anfänger-Themen 8
B Collection während Iteration verändern Java Basics - Anfänger-Themen 7
T Collection in collection Java Basics - Anfänger-Themen 6
T Collection von Objekten verschiedener Klassen Java Basics - Anfänger-Themen 4
J Collection ArrayList und mit erweitertem for iterieren Java Basics - Anfänger-Themen 7
J Probleme mit Collection ArrayList Java Basics - Anfänger-Themen 2
C Collection vs. LinkedList, Abstrakt vs. Konkret Java Basics - Anfänger-Themen 9
G Collection<BufImg> in Datei speichern Java Basics - Anfänger-Themen 8
A Collection auslesen ohne Objekttyp zu kennen? Java Basics - Anfänger-Themen 11
G Collection<Strings> - Liste von Strings verwalten Java Basics - Anfänger-Themen 9
A Struts: Über Collection iterieren mir Taglibs? Java Basics - Anfänger-Themen 13
S Collection<Typ> sort Java Basics - Anfänger-Themen 4
0x7F800000 elemente aus einer Collection korrekt löschen Java Basics - Anfänger-Themen 8
T Frage zu Vererbung beim Collection-Framework Java Basics - Anfänger-Themen 4
I Frage zu Collection und List Interfaces Java Basics - Anfänger-Themen 2
M Object [][] ist nicht vom Typ Collection? Java Basics - Anfänger-Themen 3
S Collection wie LinkedHashMap Java Basics - Anfänger-Themen 7
J LinkedList, Collection, ArrayList, List. was denn bitte? Java Basics - Anfänger-Themen 6
S Collection Sort Java Basics - Anfänger-Themen 15
A Welche Collection? Java Basics - Anfänger-Themen 13
C Collection in Verbindung mit String.split speicherlastig Java Basics - Anfänger-Themen 20
S Collection in einer Collection Java Basics - Anfänger-Themen 5
A Welche Collection soll ich nehmen? Java Basics - Anfänger-Themen 4
E welche Datenstruktur (Collection) Java Basics - Anfänger-Themen 4
K Collection und Iterator Java Basics - Anfänger-Themen 7
I Bestimmte Variablen in Collection Classes Java Basics - Anfänger-Themen 2
M Source Code von Collection Framework, etc. Java Basics - Anfänger-Themen 3
vogella Cast from Collection.toArray to String[] Java Basics - Anfänger-Themen 2
K Verständnisfrage Collection, ArrayList und Referenzen Java Basics - Anfänger-Themen 4
S Mit Collection<int[]> umgehen Java Basics - Anfänger-Themen 2
S welche collection ? String und object Java Basics - Anfänger-Themen 5
M gibt es eine collection mit definierter maximaler größe Java Basics - Anfänger-Themen 4
G Collection Framework Java Basics - Anfänger-Themen 8
V Mehrdimensionale Collection? Java Basics - Anfänger-Themen 4
U JSTL: Collection auslesen mit forEach Java Basics - Anfänger-Themen 1
A Interface Collection implementieren? Java Basics - Anfänger-Themen 4
I Collection sortieren, ":" höchste "Priorität& Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben