TreeSet neues TreeSet aufbauen

Status
Nicht offen für weitere Antworten.

johannes_

Mitglied
Hallo,

hat jemand eventuell eine Idee wie ich folgendes machen kann?

Ich will mit einer while-Schleife über ein TreeSet gehen, innerhalb der while-Schleife passe ich einen timestamp an, der vorher der Sortierung diente. Nun will ich jedesmal das TreeSet neu sortiert haben bis sich der timestamp nicht mehr ändert.

Also in Pseudocode so:

Code:
timestampChanged = true;

do {
  sortiere treeSet neu;
  while (iterate over treeset) {
    if (irgendwas) {
      timestampChanged = false;
    } else {
      timestampChanged = true;
    }
  }
} while (timestampChanged);

Leider kann man ja ein TreeSet nicht neu sortieren und jedesmal ein neues Objekt aus dem alten zu erzeugen geht ja auch nicht (weil ja das Objekt über das ich iteriere sich nicht ändern kann) oder ich habe gerade eine Hirnblockade ;-)

Viele Grüße,
Johannes
 
> und jedesmal ein neues Objekt aus dem alten zu erzeugen geht ja auch nicht (weil ja das Objekt über das ich iteriere sich nicht ändern kann)

dieser Satz macht keinen Sinn, was spricht gegen
TreeSet newSet = new TreeSet(oldSet);
oder ähnliches? dabei wird das alte Set nicht verändert, so dass es sich mit der Iteration nicht stören sollte,
außerdem willst du das gewiss höchstens einmal am Anfang oder Ende machen, nicht während der Iteration

eine andere Möglichkeit als ein neues TreeSet sehe ich nicht, das heißt aber nicht, dass es keine gibt,

etwas aufwendiger wäre, alle Elemente in eine Liste zu exportieren, das Original-TreeSet zu leeren und neu zu befüllen,
falls du kein neues TreeSet-Objekt haben sondern das alte korrigieren willst

sparsamer ist vielleicht, nur die sich geänderten Elemente zu entfernen und neu einzufügen,
also erst per Iteration diese Elemente finden und in einer separaten Liste speichern,
dann später jeweils entfernen + neu einfügen
 
Zuletzt bearbeitet von einem Moderator:
muss ich das nicht von sich selbst aufrufen, also:

Code:
    TreeSet<Page> sorted = sort.visitDocument(session);

    ...
    
    do {
      sorted = new TreeSet<Page>(sorted);
      Iterator<Page> pages = sorted.iterator();

      // Iterate over every page.
      while (pages.hasNext() && !skipPages) {
      ...
      }
    } while (timestampChanged);

also bei pages ändere ich dann den timestamp (und nach dem wird initial sortiert und soll dann jedesmal wieder sortiert werden, bis keine Änderung des timestamps mehr erfolgt).

Irgendwo habe ich jetzt eine Endlosschleife drin, ich weis nicht ob das schon an dem liegt oder daran, dass ich den timestamp falsch ändere... muss ich mal debuggen.
 
Zuletzt bearbeitet:
BRAUCHST du nach jeder Änderung die neu sortierte TreeSet? (Und muss die immer ALLE Elemente mit der neuen Sortierung enthalten?)

In Anlehnung an deinen Pseudocode könnte ich jetz vorschlagen, dass du es so machen könntest:
Code:
while (...)
{
    doIt();
}

Etwas mehrsagender wäre vielleicht
Code:
TreeSet previous = der anfängliche TreeSet
TreeSet current = new TreeSet();
boolean changed = true;
while (changed)
{
    changed = false;
    for (Key key : previous.keySet())
    {
        Value value = previous.get(key);
        if (keyHasToBeChanged)
        {
            key.change();
            changed = true;
        }
        current.put(key, value);
    }
    previous = current;
    current = new TreeSet();
}
// Neuer TreeSet ist jetzt 'previous'
Allerdings wäre das ziemlich ineffizient. Besser wäre (was SlaterB glaubich schon angedeutet hatte): Die Keys UND VALUES in Listen packen, dann ALLE Keys zu ändern, und die geänderten Keys mit den neuen Values ALLE AUF EINMAL in den neuen Set einzufügen....
 
Naja, ich will wirklich nach jeder iteration über das TreeSet eines haben, das wieder sortiert ist, nachdem ich den timestamp von manchen Objekten angepasst habe. Das alte brauche ich dann eigentlich nicht mehr zwischengespeichert, also müsste es ein "sorted = new TreeSet<Page>(sorted);" direkt bevor über das TreeSet iteriert wird tun?
 
Hoppala 😳 naja, Set, Map - so kurz nach dem Aufstehen (und bevor der erste Kaffee zu wirken beginnt) sei mir das mal verziehen 😳
 
Hm also irgendwie klappt das nicht mit dem sorted = new TreeSort(sorted); irgendwie scheint das dann nicht richtig sortiert zu sein bzw. ist die dann völlig durcheinander, aber den timestamp setzt er richtig neu...

nach dem was ihr geschrieben habt würde das TreeSet ja nur ganz am Ende dann nocheinmal sortiert aber ich will nach jedem while (timestampChanged) ein neues sortiertes TreeSet aus dem alten TreeSet haben.
 
Möglicherweise steckt da ein Designfehler drin. Mir kommt jedenfalls kein Grund in den Sinn, warum man ein halbfertiges Set benötigen sollte.

Erkläre uns doch mal, wozu das Ganze gut sein soll bzw. was du erreichen willst. 🙂

Ark
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben