(Es gibt einige Fragen über zeiteffiziente spärliche Arrays, aber ich bin auf der Suche für die Speichereffizienz.)speichereffiziente spärliche Array in Java
Ich brauche das Äquivalent eines List<T>
oder Map<Integer,T>
die
- Kann bei Bedarf wachsen, indem ein Schlüssel größer als zuvor festgelegt wird. (Kann davon ausgehen, Schlüssel sind nicht negativ.)
- Ist etwa so speichereffizient wie ein
ArrayList<T>
in dem Fall, dass die meisten Indizes nichtnull
, d. H. Wenn die tatsächlichen Daten nicht sehr spärlich ist. - Wenn die Indizes spärlich sind, wird Platz verbraucht, der proportional zur Anzahl der Indizes ist, die nicht
null
sind. - Verwendet weniger Speicher als
HashMap<Integer,T>
(da dies die Schlüssel automatisch autoboxiert und wahrscheinlich nicht den skalaren Schlüsseltyp nutzt). - Kann ein Element in amortisierter Log (N) Zeit erhalten oder setzen, wobei N die Anzahl der Einträge ist: Es muss keine lineare Zeit sein, binäre Suche wäre akzeptabel.
- Implementiert in einer nichtviralen Open-Source-Java-Bibliothek (vorzugsweise in Maven Central).
Kennt jemand solch eine Nutzungsklasse?
Ich hätte erwartet, dass Commons Collections eins haben, aber es scheint nicht zu sein.
Ich bin auf org.apache.commons.math.util.OpenIntToFieldHashMap
gestoßen, das fast richtig aussieht, außer dem Werttyp ist ein FieldElement
, der unentgeltlich scheint; Ich möchte nur T extends Object
. Es sieht so aus, als ob es einfacher wäre, seinen Quellcode zu bearbeiten, um allgemeiner zu sein, obwohl ich lieber eine binäre Abhängigkeit verwenden würde, wenn eine verfügbar ist.
Das sieht gut aus. Ich habe versucht, 'OpenIntToFieldHashMap' an einen generischen Werttyp anzupassen, der mit ~ 10min Arbeit funktioniert zu haben scheint, aber nur geringfügig besser als' TIntObjectMap' funktioniert. –