キーとして整数、値としてオブジェクトを持つHashMapを構築しようとしています。
私の構文は次のとおりです。
HashMap<int, myObject> myMap = new HashMap<int, myObject>();
ただし、返されるエラーは次のとおりです-トークン「int」の構文エラー、このトークンの後に寸法が必要キーとして。
何ができますか?
前もって感謝します! :)
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」という表現で明確にする必要があります。
整数やオートボクシングなどのラッパーを使用することをお勧めします。
代わりにInteger
を使用してください。
HashMap<Integer, MyObject> myMap = new HashMap<Integer, MyObject>();
Javaはint
プリミティブ値をInteger
オブジェクトに自動的に自動ボックス化します。
Oracle Javaドキュメントの autoboxing の詳細を参照してください。
Javaデバイス用にAndroidをコーディングし、ここで終わるすべての人のために:パフォーマンスを向上させるにはSparseArrayを使用します
private final SparseArray<myObject> myMap = new SparseArray<myObject>();
これにより、Integerの代わりにintを使用できます
int newPos = 3;
myMap.put(newPos, newObject);
myMap.get(newPos);
Troveの使用を試みることができます http://trove.starlight-systems.com/
TIntObjectHashMapはおそらくあなたが探しているものです。
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
Androidでコーディングする場合、 SparseArray があり、整数をオブジェクトにマッピングします。
HashMapの主な理由は、キーとしてプリミティブを許可しないことです。HashMapは、キーを比較するために、 equals()メソッドを使用し、メソッドはプリミティブではなくオブジェクトでのみ呼び出すことができます。
したがって、intがIntegerに自動ボックス化されると、HashmapはIntegerオブジェクトでequals()メソッドを呼び出すことができます。
そのため、intではなくIntegerを使用する必要があります。私はハッシュマップがintをキーとして入れているときにエラーをスローすることを意味します(スローされるエラーの意味がわかりません)
そして、もしあなたがそれを考えるなら、キーとしてプリミティブを作ることでマップのパフォーマンスをより速くすることができます。FastUtilと呼ばれるライブラリがあります=これには、int型をキーとして持つMap実装が含まれています。
このため、Hashmapよりもはるかに高速です
intをプリミティブ型ではなくオブジェクトとして使用します
HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();
キーとして数字を格納するだけでよいので、なぜディメンションを追加する必要があるのかわかりません(つまり、intを配列にする)。
配列もオブジェクトなので、HashMap<int[], MyObject>
は、int配列をキーとして使用する有効な構成体です。
コンパイラは、あなたが何を望んでいるのか、何を必要としているのかを知らず、ほとんど正しい言語構成体を見て、完全に正しいために欠けているものを警告します。
HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();
を使用してください