将数组映射到int Java

3

我想将一个int数组映射到一个int值上。我知道int []不适用作键。我已经尝试使用List,但也不起作用。有没有什么办法可以解决这个问题?谢谢。

以下是我的失败尝试:

    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();
    }
}

int[] 可以很好地作为哈希映射的键。然而,List<Integer> 则不行。你试图做什么以及为什么失败并不清楚。你还省略了相关信息,stateActionMap 是什么? - matt
@matt 不是的。int[] 只等于它自己。List 等于任何包含相同元素且顺序相同的其他列表。 - JB Nizet
@JBNizet 没错,这就是关键所在。一个 List 的 .equals 方法会随时间改变,使其不适合用于哈希表。而一个 int[] 则会保持不变。 - matt
2
@matt 如果列表没有被改变,它就不会随时间而改变。整个重点在于能够执行 map.get(Arrays.asList(1, 2, 3))。这是使用数组无法实现的,因为 new int[] {1, 2, 3} 永远不会等于用作映射键的数组。 - JB Nizet
好吧,我想这就是 OP 想要的,因为他说:“我知道 int[] 作为键不起作用”。 - JB Nizet
显示剩余2条评论
1个回答

3

你的问题在于你使用了单个 ArrayList 实例来存储 Map 的所有键。你需要为每个键使用一个单独的实例:

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);
}

2
请注意,在映射中使用可变数据结构作为键通常是不可取的。 - aioobe
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Eran
我需要保存所有这些实例吗?还是在函数返回后它们被删除也可以?谢谢。 - Kenadams
@Kenadams 只要 Map 没有被删除,它们就不会被删除,因为 Map 保留了对它们的引用。 - Eran
1
@Eran那么为什么不防止列表被改变,使用Collections.unmodifiableList(state_action_pair)作为键呢? - JB Nizet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接