2

是否可以创建一个键是整数数组的 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

4 回答 4

2

如果要检查条目是否存在,可以使用 a 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像我在上面所做的那样使用 an - 但这并不能保证您的所有列表都恰好是两个元素长(如果这确实是一个约束)。为了使它更健壮一点,您可以创建自己的类来表示元组。如果您这样做,请确保您实施equals()and hashCode()(这里有一篇解释良好实践的文章)。

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

于 2012-05-09T03:34:28.927 回答
2

最简单的事情是 a Map<List<Integer>, Boolean>- 甚至只是 a 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>>另一方面,A可能是很多东西:坐标、抽奖、给定部门人员的 SSN、用于付款的信用卡……程序员无法仅通过查看类型来知道,以及一组表示事物的数字很容易在另一个上下文中意外使用。ASet<Coordinate>只能是一组坐标。

于 2012-05-09T03:43:58.110 回答
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"
于 2012-05-09T03:36:18.770 回答
0

实际上 java 的表达能力比 python 低很多,所以你必须编写更多的代码。

我认为您需要通过ArrayList以下方式使用地图:

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

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

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

干杯!

于 2012-05-09T03:32:40.007 回答