繁体   English   中英

具有多个值键的HashMap

[英]HashMap with multiple valued keys

是否可以创建一个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;)!

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

提前致谢!

如果要检查条目是否存在,可以使用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() (这是一篇介绍最佳做法文章 )。

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

最简单的事情是Map<List<Integer>, Boolean> -甚至只是Set<List<Integer>> ,因为您不关心值是否等于键是否在那里。

更多的java-y解决方案将是一些表示两个int的类:

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>只能是一组坐标。

这有效:

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"

实际上,java比python缺乏表现力,因此您必须编写更多代码。

我认为您需要通过以下方式使用带有ArrayList的映射:

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

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

这是在Java中完成的方式,尽管您可以使用任何种类的集合,但集合更为常见。

干杯!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM