2016-05-03 10 views
0

Was wäre eine gute Datenstruktur in Java um Millisekunden Preisdaten zu speichern? Etwa 1.000.000 Elemente oder mehr im Container. Was ist der spezifische Container (Vektor, Array, Hash, usw.), der speziell dafür entworfen wurde, viele Daten zu speichern? Ich habe nicht die Absicht, die Daten zu filtern oder zu sortieren, aber ich brauche die Fähigkeit, einen Schlüssel (möglicherweise einen Krawattenstempel) zuzuweisen, um den entsprechenden Preis zu erhalten.Container oder Datenstruktur geeignet für die Speicherung von Millisekunden Daten

Antwort

1

Wenn Sie einen Wert (Preis) zu einem Schlüssel (Preis) zuweisen, sollten Sie eine Sammlung verwenden die Umsetzung der Map Schnittstelle: TreeMap, HashMap, Hashtable oder LinkedHashMap. Sie finden eine Übersicht der Kollektionen here.

Wenn ein Schlüssel mehr als einen Wert haben kann, benötigen Sie eine Multimap, d. H. Eine Karte, deren Wert eine Sammlung ist (siehe Beispiel here).

Angenommen, es ist nicht der Fall, würde ich vorschlagen, eine TreeMap, d. H. Eine Karte, wo Schlüssel sortiert sind. Hier ein Beispiel:

Map<Long, Double> priceHistory = new TreeMap<>(); 

    ZonedDateTime zdt1 = ZonedDateTime.now(); 
    ZonedDateTime zdt2 = ZonedDateTime.of(
     LocalDate.of(2015,9,26), 
     LocalTime.of(11,10,9), 
     ZoneId.systemDefault()); 

    priceHistory.put(zdt1.toInstant().toEpochMilli(), 10.5); 
    priceHistory.put(zdt2.toInstant().toEpochMilli(), 11.5); 

Es soll kein Problem sein zu halten 1000000 Elemente, und es sollte schnell sein, den Preis für einen bestimmten Zeitstempel zu erhalten.

+0

Sie sollten 'double' nicht verwenden, um Preisdaten zu speichern. Fließkomma ist ungenau und kann nicht viele Werte genau darstellen. Darüber hinaus ist es unwahrscheinlich, dass Sie eine "ZonedDateTime" als Map-Schlüssel verwenden möchten, da sonst die entsprechenden Zeiten in anderen Zeitzonen nicht übereinstimmen. Verwenden Sie stattdessen "Instant", wenn Sie sich für Momente interessieren, oder "LocalDateTime", wenn Sie sich für Zeitstempel interessieren. "ZonedDateTime" sollte in der Regel nur für Benutzeranzeigen verwendet werden. – dimo414

+0

Ich stimme dem Double zu (es ist nur ein Beispiel, im Idealfall wäre 'BigDecimal' am besten). Ich habe nicht ZoneDateTime als Schlüssel verwendet: Ich habe es in Instant konvertiert und dann die Millisekunden extrahiert, wie @alfred in seiner Frage angegeben hat. – joel314

1

Sie brauchen wahrscheinlich nicht wirklich Millisekunde Präzision, Sie müssen nur etwas für eine beliebige Millisekunde erhalten. Guavas RangeMap ist großartig dafür, Sie können ein RangeMap<LocalDateTime, Price> konstruieren und es mit einem Wert pro Sekunde (zum Beispiel) mit Range.closedOpen(second, second.plusSeconds(1)) als Schlüssel bevölkern. Sie können dann .get() auf einem beliebigen LocalDateTime aufrufen und es wird den Wert zurückgeben, der dem Range zugeordnet ist, der diese Zeit enthält. Sie erhalten eine willkürliche Lookup-Genauigkeit, verwenden aber nur so viel Speicherplatz, wie Sie möchten.

Wenn Sie wirklich Millisekunden-Präzision wünschen, werden Sie es schwer haben, mehr als ein paar Tage Daten effizient zu speichern. Stattdessen sollten Sie Ihre Daten in einer Datenbank speichern. Datenbanken wurden entwickelt, um große Datensätze effizient zu speichern und abzufragen, weit über das hinaus, wofür Standard-Datenstrukturen im Speicher gedacht sind.

Verwandte Themen