具有多个值键的HashMap

时间:2012-05-09 03:31:37

标签: java hashmap

是否可以创建一个HashMap,其键是一个整数数组?

我习惯使用Python,最近我开始使用Java。在我的工作中,我需要使用以下键创建一个HashMap:

map.put([5,2], 1);
map.put([3,2], 0);

等等。我是否用它来测试地图上是否有一对数字,如果是,那么就做一些事情,如果没有,继续。

为此,我尝试了以下方法:

Map<Array, Boolean> test = new HashMap<Array, Boolean>();
int[] a1 = {5,2};
test.put(a1, true);

Eclipse给出了消息(“参数不适用于int [] ...”)。但是我做的任何配置都会出错。

我尝试使用ArrayList,地图内的对象,嵌套的HashMap等等但都没有用(在python中很容易,我只是写dict [(5,2)] = 1,所以我想在Java有一些简单的东西)。我被建议将数字转换为字符串并在之间添加冒号,如:

map.put("5:2", 1);

以后我又打破了字符串,但如果这是解决方案,我会回到Python;)!!

这可能是一个非常简单的问题,但我找不到答案,希望你能帮助我。

提前致谢!

4 个答案:

答案 0 :(得分:2)

如果您想检查输入的存在,可以使用Set(一个有用的具体实现是HashSet

final Set<List<Integer>> population;

population = new HashSet<List<Integer>>();
population.add(Arrays.asList(1, 2));

if (population.contains(Arrays.asList(1, 2)))
{
  ...
}

您可以像我上面所做的那样使用List - 但这并不能保证您的所有列表都长度恰好是两个元素(如果这确实是一个约束)。为了使它更健壮,您可以创建自己的类来表示元组。如果您这样做,请确保实施equals()hashCode()(此处为article explaining good practice)。

Arrays.asList()是在代码中在线创建列表的有用方法。更通用的列表是ArrayList

答案 1 :(得分:2)

最简单的事情是Map<List<Integer>, Boolean> - 甚至只是Set<List<Integer>>,因为你不关心价值是否与密钥一样。

java-y解决方案越多,代表两个整数的类就会出现:

public class Coordinate { // or whatever
    private final int x;
    private final int y;

    // constructor and overrides for equals, hashCode and toString
}

然后有Set<Coordinate>

这被认为是更具惯用性的Java,因为类名告诉你这个集合的确切含义 - 并强制它以这种方式使用。另一方面,Set<List<Integer>>可能有很多东西:坐标,彩票选择,特定部门人员的SSN,付款的信用卡......程序员无法通过查看来了解在类型上,一组数字很容易意味着在另一个环境中偶然使用的东西。 Set<Coordinate>不能是一组坐标以外的任何东西。

答案 2 :(得分:1)

这有效:

Map<List<Integer>,Boolean> map = new HashMap<>();
map.put( Arrays.asList( new Integer(1), new Integer(2) ), false );
map.put( Arrays.asList( 4, 5 ), true ); // Integer type is inferred and ints are autoboxed

map.get( Arrays.asList( 1, 2 ) ); // gets the Boolean object for "false"

答案 3 :(得分:0)

实际上java比python的表达要差很多,所以你不得不多写一些代码。

我认为您需要以下列方式使用带有ArrayList的地图:

ArrayList al = map.get("key");
if (al == null) {
    al = new ArrayList();
    map.put("key", al)
}
al.add(some_object);

您也可以使用数组作为键(如您所要求的那样),可能您需要一个不可变数组。哈希映射的关键是使用一些具有良好equalshashCode实现的对象。

这是在java中完成的方式,你可以使用任何类型的集合,集合更常见。

干杯!