Javaのプリミティブのマップ

 1. 概要

このチュートリアルでは、*プリミティブなキーと値でマップを構築する方法を学びます*。
ご存知のように、コアJava link:/java-hashmap[__Map__s]では、プリミティブキーまたはプリミティブ値を保存できません。 そのため、プリミティブマップの実装を提供する多数の外部サードパーティライブラリを導入します。

2. Eclipseコレクション

つまり、* https://www.baeldung.com/eclipse-collections [Eclipse Collections]は、Java *用の高性能コレクションフレームワークです。 実装の改善と、*多くのプリミティブコレクション*などの追加のデータ構造を提供します。
より具体的には、プリミティブマップの可変、不変、および変更不可能な実装があります。

* 2.1。 可変および不変_Maps_ *

キーと値の両方がプリミティブ__int__sである空のマップを作成しましょう。 そのために、_IntIntMaps_ファクトリークラスを使用します。
MutableIntIntMap mutableIntIntMap = IntIntMaps.mutable.empty();
  • _IntIntMaps_ファクトリクラスは、プリミティブマップを作成する最も便利な方法です*。 これにより、目的のタイプのマップの可変インスタンスと不変インスタンスの両方を作成できます。 この例では、_IntIntMap_の可変インスタンスを作成しました。 同様に、_IntIntMaps.mutable_静的ファクトリー呼び出しを_IntIntMaps.immutable_に置き換えるだけで、不変のインスタンスを作成できます。

ImmutableIntIntMap immutableIntIntMap = IntIntMaps.immutable.empty();
それでは、可変マップにキーと値のペアを追加しましょう。
mutableIntIntMap.addToValue(1, 1);
同様に、*参照とプリミティブ型のキーと値のペアで混合マップを作成できます。* _String_キーと_double_ valuesを使用してマップを作成しましょう。
MutableObjectDoubleMap dObject = ObjectDoubleMaps.mutable.empty();
ここでは、_ObjectDoubleMaps_ファクトリクラスを使用して、_MutableObjectDoubleMap_の可変インスタンスを作成しました。
次に、いくつかのエントリを追加しましょう。
dObject.addToValue("price", 150.5);
dObject.addToValue("quality", 4.4);
dObject.addToValue("stability", 0.8);

* 2.2。 プリミティブAPIツリー*

Eclipseコレクションでは、_PrimitiveIterable_は、_Map_を含むすべてのプリミティブコンテナーの基本インターフェイスです。 さらに、各プリミティブ型には、_PrimitiveIterable_から派生した独自のベースインターフェイスがあります。
たとえば、_ShortIterable_ベースインターフェイスは_short_プリミティブタイプ用で、_LongIterable_は_long_プリミティブタイプ用です。 同様に、_int、byte、float、double、_ boolean、および_char_型の場合、基本インターフェイスはそれぞれ_IntIterable、ByteIterable、FloatIterable、DoubleIterable、BooleanIterable、_および__CharIterable、___です。
これらのすべてのベースインターフェイスには、_XYMap_実装の独自のツリーがあります。
*まず、各インターフェイスには、可変と不変の2種類の実装があります。
第二に、これらのすべてのプリミティブマップの実装には、*プリミティブと残りのプリミティブタイプのすべての組み合わせ*があります。 したがって、_int_には_FloatIntMap –_とその可変および不変の実装がありますが、_IntFloatMap_もあります。
最後に、ほんの少し前に見たように、*プリミティブ型と参照型を混合するための*インターフェースがあります。 _int_の場合、_Object_キーをプリミティブ型と混合するための_ObjectIntMap <K> _と、プリミティブキーを_Object_値と混合するための逆の_IntObjectMap <K> _を取得します。 もちろん、_K、_は、必要なオブジェクトの参照型です。

3. グローブ

  • https://search.maven.org/search?q = g:net.sf.trove4j%20a:trove4j [Trove]は、https://www.baeldung.com/java-listを提供する別の高性能ライブラリです。 -primitive-int [primitive collections] for Java *。

* 3.1。 クイックスタート*

まず、_double_タイプのキーと_int_値を受け入れるプリミティブマップを作成しましょう。
TDoubleIntMap doubleIntMap = new TDoubleIntHashMap();
次に、いくつかのエントリを追加しましょう。
doubleIntMap.put(1.2, 22);
doubleIntMap.put(4.5, 16);

* 3.2。 調整可能なエントリ*

Troveの興味深い機能は、*エントリ値を調整する機能です*。
これで、キーと値を持つマップがある場合、いくつかのエントリを調整できます。
doubleIntMap.adjustValue(1.2, 1);
doubleIntMap.adjustValue(4.5, 4);
doubleIntMap.adjustValue(0.3, 7);
ここで、最初の2つの操作は_1_および_4_単位で_1.2_および_4.5_キーを増やします。 ただし、最後のadjustValue()は_false_を返しますが、効果はありません。 これは、_0.3_キーを持つエントリがないためです。

3.3. 完全なコンストラクター

私たちは皆、** Javaで_Map_を構築することの苦痛を経験していますが、**コンストラクタを呼び出してから要素を個別に提供する必要があります。
Troveでは、事前にキーと値を知っていれば、コンストラクター引数として値を提供できます。 まず、キー配列を定義しましょう:
double[] doubles = new double[] {1.2, 4.5, 0.3};
次に、値:
int[] ints = new int[] {1, 4, 0};
最後に、コンストラクタにそれらを渡します。
TDoubleIntMap doubleIntMap = new TDoubleIntHashMap(doubles, ints);

* 3.4。 カンニングペーパー*

JDKの_Map_実装で使用可能なすべての標準メソッドに加えて、Troveはさらにいくつかの便利なメソッドを提供します。
  • * putIfAbsent(key、value) * –キー、値エントリを追加するのは、
    マップにキーが含まれていません

  • * adjustOrPutValue(key、adjust_amount、put_amount) * –ここで
    _put_amount_は初期値、_adjust_amount_は増分の量です

  • * adjustValue(key、amount) * – _adjustOrPutValue()_に似ています
    1つの例外:初期値は設定されません。 したがって、指定された_key_との関連付けがない場合、_adjustValue()_は何も変更せず、_false_を返します

  • * increment(key) * –内部で_adjustValue(key、1)_を呼び出します

  • * retainEntries(TDoubleIntProcedure) * –次のエントリのみを保持します
    手順を満たす

    http://trove4j.sourceforge.net/javadocs/gnu/trove/map/package-summary.html[_gnu.trove.map_]パッケージには、プリミティブマップを操作するためのすべてのインターフェイスが含まれています。 さらに、次のようなキーと値のペアのすべての組み合わせを使用できます。
  • *プリミティブキーとプリミティブ値– *たとえば、TDoubleIntMap
    インターフェイスは_double_キーと_int_値のプリミティブマップです

  • *プリミティブキーと_Object_値– * _TByteObjectMap <T> _は、
    _byte_キーと_T_の参照型

  • そして最後に、* an Objectキーとプリミティブ値
    – * TObjectByteMap <T> は、_T_型_Object_キーおよび_byte_値のプリミティブマップです。

    内部では、すべてのプリミティブマップにデータを保持するための3つのプリミティブコンテナーがあります。
  • __values [] _ –プリミティブ値を保持します

  • __set [] _ –キープリミティブを保持します

  • __states [] –_はセルの状態を維持します–空き、占有、削除

4. コルト

https://search.maven.org/search?q=g:colt%20a:colt[Colt]は、Javaでの科学技術計算用のオープンソースライブラリです。

* 4.1。 単純な同等物*

Coltは、* Javaの__Map __interface *に相当する単純なプリミティブ間プリミティブとして輝いています。
まず、_int_から_double_への関連付けマップを作成しましょう。
AbstractIntDoubleMap map = new OpenIntDoubleHashMap();
次に、値を追加できます。
map.put(1, 4.5);
そしてそれを取得します。
double value = map.get(1);
さらに、Coltプリミティブマップは、_containsKey(value)、containsValue(key)、_、および_keyOf(value)_などの標準メソッドを提供します。

* 4.2。 オープンアドレッシングとチェーン*

  • _cern.colt.map_パッケージには、_double_および_int_プリミティブデータ型の自動的に拡大および縮小するマップが含まれています*。 内部では、ダブルハッシングを使用したオープンアドレッシングを使用しています。 オープンアドレッシングとは、すべてのエントリが*追加のデータ構造を使用せずに*ハッシュテーブルに保存されることを意味します。*

    *一方、Javaはチェーンを使用します。*これは衝突の解決には適していますが、多数のlink:/java-linkedlist[__LinkedList__s]を必要とするため、より多くのメモリフットプリントがあります。
    ___double__から_int_への関連付けの場合、コアJavaの_https://www.baeldung.com/java-hashmap [HashMap] _に相当するものは_OpenDoubleIntHashMapです。最後に、_OpenLongObjectHashMap_クラスは_long_から_Object_型用です。
    さらに、各マップ実装には、_AbstractDoubleIntMap、AbstractIntDoubleMap、AbstractIntIntMap、_、および_AbstractLongObjectMap._などの抽象基本クラスがあります。

*5. Fastutil *

  • https://search.maven.org/search?q = g:it.unimi.dsi%20a:fastutil [Fastutil]は、プリミティブ型マップを含む型固有のコレクションを提供する高速でコンパクトなフレームワークです*。

* 5.1。 簡単な例*

EclipseコレクションおよびTroveと同様に、Fastutilはプリミティブ型からプリミティブ型およびプリミティブ型からオブジェクト型の関連マップも提供します。
_int_から_boolean_へのプリミティブマップインスタンスを作成しましょう。
Int2BooleanMap int2BooleanMap = new Int2BooleanOpenHashMap();
さらに、いくつかのエントリを追加しましょう。
int2BooleanMap.put(1, true);
int2BooleanMap.put(7, false);
int2BooleanMap.put(4, true);
さらに、キーによっていくつかの値を取得できます。
boolean value = int2BooleanMap.get(1);
最後に、ソートされた_int_から_boolean_の空のマップを作成する方法を次に示します。
Int2BooleanSortedMap int2BooleanSorted = Int2BooleanSortedMaps.EMPTY_MAP;

* 5.2。 プリミティブマップ*

例として、_int_から_boolean_のキーと値の関連付けを選択してみましょう。 _it.unimi.dsi.fastutil.ints_パッケージには、_Int2BooleanMap_や_Int2BooleanSortedMap._などのさまざまなインターフェイスが含まれています
*不思議なことに、コルトのような、オープンアドレス指定用の_Int2BooleanOpenHashMap_もあります。*
さらに、** Int2BooleanOpenCustomHashMap._を使用して、カスタムハッシュ戦略でマップを作成できます。

6. 結論

この記事では、Eclipse Collections、Trove、Colt、Fastutil *を使用して、Javaでプリミティブマップを作成する方法を学びました。
最後に、この記事の完全なコードはhttps://github.com/eugenp/tutorials/tree/master/java-collections-maps-2[on on GitHub]で入手できます。