将数组映射到int-Java

将数组映射到int-Java,java,arrays,dictionary,hashmap,Java,Arrays,Dictionary,Hashmap,我正在尝试将整数和整数数组映射到一个整数值。我知道int[]不能用作键。我试过这个列表,但效果不太好。还有什么我可以做的吗?谢谢 以下是我失败的尝试: private void createMap(){ List<Integer> state_action_pair = new ArrayList<Integer>(); for(int i=0;i<this.stateActionTable.length;i++){ for(

我正在尝试将整数和整数数组映射到一个整数值。我知道int[]不能用作键。我试过这个列表,但效果不太好。还有什么我可以做的吗?谢谢

以下是我失败的尝试:

    private void createMap(){
    List<Integer> state_action_pair = new ArrayList<Integer>();
    for(int i=0;i<this.stateActionTable.length;i++){
        for(int j=0;j<this.stateActionTable[0].length;j++){
            state_action_pair.add(this.stateActionTable[i][j]);
        }
        this.stateActionMap.put(state_action_pair, i);
        state_action_pair.clear();
    }
}
private void createMap(){
列表状态\操作\对=新建ArrayList();

对于(int i=0;i,您的问题是对
Map
的所有键使用一个
ArrayList
实例。每个键都需要一个单独的实例:

private void createMap(){
  for(int i=0;i<this.stateActionTable.length;i++){
    List<Integer> state_action_pair = new ArrayList<Integer>();
    for(int j=0;j<this.stateActionTable[0].length;j++){
        state_action_pair.add(this.stateActionTable[i][j]);
    }
    this.stateActionMap.put(state_action_pair, i);
}
private void createMap(){

对于(int i=0;注意,在映射中使用可变数据结构作为键通常是一个很大的禁忌。@aioobe只要OP不改变它们,一切都会正常工作。当然,使用不可变列表会更安全。我必须保存所有这些实例,还是在函数返回后删除它们?thanks@Kenadams它们不是德只要映射没有被删除,就可以删除,因为映射会保留对它们的引用。@Eran那么为什么不阻止列表发生变异,并使用
集合。不可修改列表(state\u action\u pair)
作为键?int[]可以用作hashmap的键。另一方面,列表则不行。不清楚您为什么尝试这样做,以及为什么失败。您还忽略了相关信息,什么是stateActionMap?@matt no.An int[]只等于它本身。一个列表与包含相同顺序的相等元素的任何其他列表相同。@JBNizet完全相同。一个列表,.equals将随着时间的推移而改变,使其不适用于hashmap。int[]将保持不变。@matt如果列表没有变异,它不会随着时间的推移而改变。整个要点是能够执行
map.get(Arrays.asList(1,2,3))
这是不可能用数组来做的,因为
newint[]{1,2,3}
永远不会等于映射中用作键的数组。它不是关于数组或列表,而是关于可变性。
HashMap
/
HashSet
文档都说,如果修改键,行为是未定义的。如果列表是不可变的,它可以安全地用作键。