TreeMap<Date,Object> navigieren?

algebraiker

algebraiker

Aktives Mitglied
Hi,

ich habe eine
Code:
TreeMap<Date, Object>
, die aufsteigend sortiert ihre Keys beinhaltet. Nun möchte ich gerne navigieren.

Gibt es eine Möglichkeit, dass ich irgendwie automatisch den Key des Nachfolgers oder Vorgängers mit
Code:
next
oder
Code:
previous
o.ä. bekomme?

Ich kann auch auf andere Datenstruktur umsteigen, falls eine solche genau so etwas beinhaltet... Aber gefunden habe ich dazu bisher nichts.

Danke euch.
 
B

bygones

Gast
du kannst dir wie bei jeder Map ueber [c]entrySet()[/c] ueber die Entries laufen, ueber [c]keySet[/c] ueber die Keys (beides dann per Iterator)

aber der default iterator ist immer nur in eine richtung (next).
 
L

langhaar!

Bekanntes Mitglied
Map vefügt über eine Methode keySet(), mit der du über alle Schlüssel iterieren kannst. keySet() liefert allerdings eine Menge, somit ist keine Ordnung vorgegeben. Du musst also noch sortieren.
 
M

maki

Gast
TreeMap ist u.a. eine SortedMap, da kann man schon was mit der Reihenfolge anfangen, zB. descendingKeySet(), descendingMap, etc. pp.

Allterdings bekommt man ime keinen Iterator mit dem man vor und gleichzeitig zurücknavigieren kann.

Was genau brauchst du denn?
Vielleicht könnte man etwas passenderes empfehlen...
 
algebraiker

algebraiker

Aktives Mitglied
Ich habe z.B. folgendes:

Date;Val1;Val2;Val3;Val4
1970;12;34;3;3
1971;5;12;1;2
1972;6;23;5;21
1973;7;56;4;34

Das ist als
Code:
TreeMap<Date, TestKlasse>
realisiert.

Nun möchte ich in dieser TreeMap bei 1971 beginnen (also nicht beim ersten Key!). Dazu benötige ich den Wert Val3 von vorherigen Key, also von 1970 - in dem Fall 3. Anhand dieses Val3 vom vorherigen Key (des aktuellen Keys) soll dann eine bestimmte Operation durchgeführt werden.

Daher fragte ich, ob ich irgendwie an den vorherigen (und nur an den vorherigen!) Key des aktuellen Keys irgendwie rankomme?

Versteht ihr was ich meine? ???:L Oder drücke ich mich unklar aus? :bahnhof:
 
algebraiker

algebraiker

Aktives Mitglied
Ja, daran dachte ich auch schon. Damit bekomme ich aber, wenn ich z.B. beim Key 1990 bin aber den Key 1970 richtig?

Mein Problem ist dabei folgendes. Wenn ich irgendwann den Key z.B. auf String oder gar irgendein anderes Objekt wechsle, bekomme ich denn dadurch nicht immer den kleinsten Wert und nicht somit den Vorgänger?

Mal eine Interessensfrage, falls meine Vermutung stimmt. Was für einen Grund gibt es denn, dass es eine solche allgemeine Methode
Code:
Object previousKey()
nicht gibt? ???:L
 
algebraiker

algebraiker

Aktives Mitglied
Gerade probeweise getestet.

Code:
System.out.println(map.lowerKey( new Date(1972,0,0) ));
spuckt mir den Key 1992 aus und nicht 1971. :noe:
 
M

maki

Gast
Mein Problem ist dabei folgendes. Wenn ich irgendwann den Key z.B. auf String oder gar irgendein anderes Objekt wechsle, bekomme ich denn dadurch nicht immer den kleinsten Wert und nicht somit den Vorgänger?
TreeMap/SortedMap/NavigatableMap haben bestimmte Anfordurngen an die Keys:
A Red-Black tree based NavigableMap implementation. The map is sorted according to the natural ordering of its keys, or by a Comparator provided at map creation time, depending on which constructor is used.
d.h. entweder wird das Interface Comparable implem,entiert, oder man gibt einen Comparator mit, dann ist es egal welche Objekte als Key verwendet werden, solange sie eben comparable sind.
 
M

Marco13

Gesperrter Benutzer
Dazu benötige ich den Wert Val3 von vorherigen Key, also von 1970 - in dem Fall 3. Anhand dieses Val3 vom vorherigen Key (des aktuellen Keys) soll dann eine bestimmte Operation durchgeführt werden.

Der vorige vom nächsten ist der aktuelle, außer denn der nächste der aktuelle ist, dann ist der vorige der vorige. (Das wollte ich nur mal erwähnt haben :roll: ;) )

Beschreib nochmal etwas klarer, was du meinst. Mit lowerKey/higherKey und floorEntry/ceilingEntry sollte man eigentlich schon vernünftig da durch navigieren können...
 
M

maki

Gast
Das funzt bei mir:
Java:
		TreeMap<Date, String> treeMap = new TreeMap<Date, String>();
		
		treeMap.put(new Date(1970,0,0), "1970");
		treeMap.put(new Date(1972,0,0), "1972");
		treeMap.put(new Date(1992,0,0), "1992");
		
		
		System.out.println(treeMap.lowerEntry(new Date(1971,0,0)));
		System.out.println(treeMap.lowerKey(new Date(1971,0,0)));
Ausgabe:
Code:
Fri Dec 31 00:00:00 CET 3869=1970
Fri Dec 31 00:00:00 CET 3869
Dieser Konstructor von java.util.Date ist natürlich deprecated...
 
algebraiker

algebraiker

Aktives Mitglied
Erstmal vielen Dank für eure Hilfe. Das möchte ich nochmal betonen.

Also ich habe z.B. folgendes gegeben, realisiert als
Code:
Treemap<Date,TestKlasse>
:

Date;Val1;Val2;Val3;Val4
1970;12;34;3;3
1971;5;12;1;2
1972;6;23;5;21
1973;7;56;4;34
1974;45;33;1;4
1975;6;5;4;5
1976;323;232;3;234
1977;67;67;1;22

Ich möchte nun nicht beim ersten Key beginnen, denn das bringt mir nichts, sondern beim zweiten Key. Bin also bei 1972. Hier betrachte ich den Wert Val3 von 1971 (also vom vorherigen Key) und multipliziere es meinetwegen mit einer Zufallszahl. Nachdem das getan ist, gehe ich einen Key weiter (klar) und bin bei 1973. Hier hole ich mir den Wert Val3 von 1972 und multipliziere es erneut mit einer Zufallszahl. Und das mache ich so lange bis ich am Ende (hier bei 1977) angelangt bin und hole mir den Wert von Val3 von 1976, also 3 und multipliziere das wieder mit einer Zufallszahl.

Das ist jetzt etwas vereinfacht, denn ich bräuchte evtl. mehrere Valx des vorherigen Keys, aber wollte es nicht noch komplizierter erklären, als es vermutlich eh schon ist. :D

Das ist übrigens keine Hausaufgabe, falls der Verdacht auftritt.

Edit: Ja, das mit Date weiß ich. Habe ich nur verwendet, um das schnell zu testen...
 
B

bygones

Gast
doofe frage:

ist das nur als demonstrationsbsp ? wenn fuer dich nur Val3 interessant ist und du nur eine Reihenfolge brauchst, warum speicherst du dir nicht Val3 einfach ein einer Liste ?
 
algebraiker

algebraiker

Aktives Mitglied
@maki:

Krude Geschichte ist das.

Bei mir wird für

Java:
for(Entry<Date,Assignment> entry : map.entrySet()) {
            System.out.println(entry.getKey());
        }
        
        System.out.println("\n" + map.lowerEntry(new Date(1973,0,0)).getKey());

das ausgespuckt:

Fri Jan 01 00:00:00 CET 1971
Sat Jan 01 00:00:00 CET 1972
Mon Jan 01 00:00:00 CET 1973
Tue Jan 01 00:00:00 CET 1974
Wed Jan 01 00:00:00 CET 1975
Thu Jan 01 00:00:00 CET 1976
Sat Jan 01 00:00:00 CET 1977
Sun Jan 01 00:00:00 CET 1978
Mon Jan 01 00:00:00 CET 1979
Tue Jan 01 00:00:00 CET 1980
Thu Jan 01 00:00:00 CET 1981
Fri Jan 01 00:00:00 CET 1982
Sat Jan 01 00:00:00 CET 1983
Sun Jan 01 00:00:00 CET 1984
Tue Jan 01 00:00:00 CET 1985
Wed Jan 01 00:00:00 CET 1986
Thu Jan 01 00:00:00 CET 1987
Fri Jan 01 00:00:00 CET 1988
Sun Jan 01 00:00:00 CET 1989
Mon Jan 01 00:00:00 CET 1990
Tue Jan 01 00:00:00 CET 1991
Wed Jan 01 00:00:00 CET 1992

Wed Jan 01 00:00:00 CET 1992
 
algebraiker

algebraiker

Aktives Mitglied
doofe frage:

ist das nur als demonstrationsbsp ? wenn fuer dich nur Val3 interessant ist und du nur eine Reihenfolge brauchst, warum speicherst du dir nicht Val3 einfach ein einer Liste ?

Das ist leider kein Demonstrationsbeispiel, sondern ein mehrstufiges Fuzzy-System-verfahren (auf Zeitreihenbasis), das ich schon fast fertig implementiert habe. Nur der Teil fehlt mir noch...
 
B

bygones

Gast
Das ist leider kein Demonstrationsbeispiel, sondern ein mehrstufiges Fuzzy-System-verfahren (auf Zeitreihenbasis), das ich schon fast fertig implementiert habe. Nur der Teil fehlt mir noch...
dennoch finde ich die gewaehlte Struktur fuer diese Fragestellung merkwuerdig. Wenn sie fest ist aufgrund von anderen Bedingungen, ok.... aber fuer deine konkrete Beschreibung hier brauchst du doch nur die Val3 Werte ?!

falls irrelevant - ignoriere das
 
algebraiker

algebraiker

Aktives Mitglied
Es hilft leider wirklich nichts, da muss diese Struktur her. Ich würd's gern ändern, aber anders haut's leider gleich gar nicht hin. :-/
 
algebraiker

algebraiker

Aktives Mitglied
@maki:
Ich mach wirklich nichts schlimmes. :)

Ich habe eine Klasse
Java:
Util
, in der ich einfach nur diese Methode zum Testen drin habe:

Java:
public void TreeMap<Date, TestClass1> testMap(TreeMap<Date, TestClass2> map) {
        
        for(Entry<Date,TestClass2> entry : map.entrySet()) {
            System.out.println(entry.getKey());
        }
        
        System.out.println("\n" + map.lowerEntry(new Date(1973,0,0)).getKey());
    }

Dann habe ich in der
Code:
main
-Methode als allerletztes stehen.

Java:
public static void main( String[] argv )
    {
       
            ...

            Util.testMap(treeMap);                       
        }
        catch ( Exception e ) {
            throw new RuntimeException( e.getMessage() );
        }

    }

Und was dabei rauskommt, sieht man ja. :D
 
algebraiker

algebraiker

Aktives Mitglied
Ich denke darüber nach, ob ich den ersten Key nicht zwischenspeichern kann mit einer Bedingung und dann einfach eins weiterlaufe und somit den vorangegangen Key hole.

Kann man das mit einer booleschen Bedingung irgendwie lösen? Damit wäre es - glaube ich zumindest - auch getan.
 
algebraiker

algebraiker

Aktives Mitglied
Ich fülle sie so:

Java:
public static TreeMap<Date, TestClass2> fillData( List<WList> wlList, Map<Integer, CWrite> map )
    {

        TreeMap<Date, TestClass2> newMap = new TreeMap<Date, TestClass2>();

        List<WList> sortDate = Cluster.sortByDate( wlList );

        for ( int i = 0; i < sortDate.size(); i++ ) {
            TestClass2 a = new TestClass2();
            a.setDate( sortDate.get( i ).getDate() );
            a.setSingular( sortDate.get( i ).getSingular() );

            for ( Entry<Integer, CWrite> entry : map.entrySet() ) {
                for ( int j = 0; j < entry.getValue().getElements().size(); j++ ) {
                    if ( a.getSingular() == entry.getValue().getElements().get( j ) ) {
                        a.setCenter( entry.getValue().getCenter() );
                        a.setRelat( entry.getValue().getRelat() );
                        a.setHeights( entry.getValue().getFrequencies() );
                        newMap.put( a.getDate(), a );
                        break;
                    }
                }

            }

        }

        return newMap;
    }

Ich habe es nun ganz banal gelöst...

Java:
Date lastDate = null;
        
        for(Entry<Date,TestClass2> entry : map.entrySet()) {
            if(lastDate != null) {
                
                System.out.println(map.get( lastDate).getRelat());
            }
            lastDate = entry.getKey();
        }

Damit bekomme ich pro Schleifendurchlauf genau den Vorgängerkey und kann somit auf einzelne Sachen des Objekts zugreifen..
 
algebraiker

algebraiker

Aktives Mitglied
Coole Sache das. Funktionert nun alles wie geschmiert! Danke euch für eure Hilfe. Jetzt weiß ich wenigstens, dass ich in Zukunft die das Navigieren "händisch" lösen muss.
 

Ähnliche Java Themen

Anzeige

Neue Themen


Oben