web-dev-qa-db-ja.com

HashMapおよびキーとしてのint

キーとして整数、値としてオブジェクトを持つHas​​hMapを構築しようとしています。

私の構文は次のとおりです。

HashMap<int, myObject> myMap = new HashMap<int, myObject>();

ただし、返されるエラーは次のとおりです-トークン「int」の構文エラー、このトークンの後に寸法が必要キーとして。

何ができますか?

前もって感謝します! :)

98
MrD

HashMapはキーの内部でオブジェクトを使用するため、プリミティブは使用できません。そのため、Objectを継承するオブジェクト(つまり、任意のオブジェクト)のみを使用できます。

これはHashMapの関数put()であり、ご覧のとおり、Kのオブジェクトを使用しています。

public V put(K key, V value) {
    if (key == null)
        return putForNullKey(value);
    int hash = hash(key);
    int i = indexFor(hash, table.length);
    for (Entry<K,V> e = table[i]; e != null; e = e.next) {
        Object k;
        if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
            V oldValue = e.value;
            e.value = value;
            e.recordAccess(this);
            return oldValue;
        }
    }

    modCount++;
    addEntry(hash, key, value, i);
    return null;
}

「k = e.key」という表現で明確にする必要があります。

整数やオートボクシングなどのラッパーを使用することをお勧めします。

18
user1883212

代わりにIntegerを使用してください。

HashMap<Integer, MyObject> myMap = new HashMap<Integer, MyObject>();

Javaはintプリミティブ値をIntegerオブジェクトに自動的に自動ボックス化します。

Oracle Javaドキュメントの autoboxing の詳細を参照してください。

124
gaborsch

Javaデバイス用にAndroidをコーディングし、ここで終わるすべての人のために:パフォーマンスを向上させるにはSparseArrayを使用します

private final SparseArray<myObject> myMap = new SparseArray<myObject>();

これにより、Integerの代わりにintを使用できます

int newPos = 3;

myMap.put(newPos, newObject);
myMap.get(newPos);
40
Stepoid

Troveの使用を試みることができます http://trove.starlight-systems.com/
TIntObjectHashMapはおそらくあなたが探しているものです。

4
Arek

HashMapでは、プリミティブデータ型を引数として使用できません。オブジェクトのみを受け入れることができます

HashMap<int, myObject> myMap = new HashMap<int, myObject>();

動作しないでしょう。

宣言を変更する必要があります

HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();

あなたが次のことをしたとしても

myMap.put(2,myObject);

プリミティブデータ型は、整数オブジェクトに自動ボックス化されます。

8 (int) === boxing ===> 8 (Integer)

オートボクシングの詳細については、こちらをご覧ください http://docs.Oracle.com/javase/tutorial/Java/data/autoboxing.html

3
Lakshmi

Androidでコーディングする場合、 SparseArray があり、整数をオブジェクトにマッピングします。

3
alvinsj

HashMapの主な理由は、キーとしてプリミティブを許可しないことです。HashMapは、キーを比較するために、 equals()メソッドを使用し、メソッドはプリミティブではなくオブジェクトでのみ呼び出すことができます。

したがって、intがIntegerに自動ボックス化されると、HashmapはIntegerオブジェクトでequals()メソッドを呼び出すことができます。

そのため、intではなくIntegerを使用する必要があります。私はハッシュマップがintをキーとして入れているときにエラーをスローすることを意味します(スローされるエラーの意味がわかりません)

そして、もしあなたがそれを考えるなら、キーとしてプリミティブを作ることでマップのパフォーマンスをより速くすることができます。FastUtilと呼ばれるライブラリがあります=これには、int型をキーとして持つMap実装が含まれています。

このため、Hashmapよりもはるかに高速です

2
FatherMathew

intをプリミティブ型ではなくオブジェクトとして使用します

HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();
1
franki3xe

キーとして数字を格納するだけでよいので、なぜディメンションを追加する必要があるのか​​わかりません(つまり、intを配列にする)。

配列もオブジェクトなので、HashMap<int[], MyObject>は、int配列をキーとして使用する有効な構成体です。

コンパイラは、あなたが何を望んでいるのか、何を必要としているのかを知らず、ほとんど正しい言語構成体を見て、完全に正しいために欠けているものを警告します。

0
Yoory N.

HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();を使用してください

0
Michael