2012-05-09 66 views
2

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

,后来我再次突破字符串,但如果这是解决方案I'll回到Python的;)!

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

在此先感谢!

+1

如果你总是只需要2个整数作为地图中的关键字,那么最好的解决方案是用2个整数和一个散列函数创建你自己的类,然后使用该类的实例作为关键。 – MTilsted

回答

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

+0

令人惊叹!非常感谢你们所有人的答案!那么我已经尝试过这一个,工作得很好。我仍然不明白为什么需要实现equals()和hashCode(),但我肯定会研究它! Tnx =)!! –

+0

对于散列数据结构('HashSet','HashMap'),使用'hashCode()'将对象分布在存储桶中。 'equals()'用于确保在散列冲突的情况下确保该对象确实是请求的对象。因此,两者都必须实施并遵守这样的规则:如果对象相同,则它们也必须具有相同的哈希码才能工作。 –

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中完成的方式,虽然可以使用任何类型的集合,但集合更常见。

干杯!

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" 
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>>,可能是很多的东西:坐标,彩票挑选,特定部门的人的SSNs,付款的信用卡......你只是通过查看类型,程序员无法知道,而且对于意外事件在另一个环境中意外使用的一组数字很容易。 A Set<Coordinate>只能是一组坐标。

+0

我同意,Set 是一个很好的面向对象的解决方案 –