在java中使用Hashmaps时遇到问题

时间:2014-11-20 01:08:09

标签: java hashmap

在一个程序中,我必须阅读三行文字。每行有一个空格,两边各有两个对象。第一个是字符串(运算符),第二个是数字(数字)。在读完这3行后,我将它们放入一个哈希映射中以便以后使用。

我有一种添加线条的自动方法,但为了尝试调试此问题,我必须手动将线条信息添加到地图中。这是我目前的代码:

String line1 = in.nextLine();
        String line2 = in.nextLine();
        String line3 = in.nextLine();

        System.out.println(line1 + " " + line2 + " " + line3);
        map.put(line1.split(" ")[0],
                Integer.parseInt(line1.split(" ")[1]));
        map.put(line2.split(" ")[0],
                Integer.parseInt(line2.split(" ")[1]));
        map.put(line3.split(" ")[0],
                Integer.parseInt(line3.split(" ")[1]));
        if (in.hasNextLine())
            in.nextLine();
        System.out.println("Size: " + map.size());

第一个打印语句(line1 + line2 + line3)每次打印地图应具有的正确读数输入:

* 4 - 3 / 2

然后将其放入地图,然后进行计算,然后打印出一些真/假的陈述(在程序的上下文中

* 4 - 3 / 2
Size: 3
- 3
Found solution for - 3. It's 1 4
/ 2
Found solution for / 2. It's 2 5
* 4
Not Possible.

正如您所看到的,我的程序正确地通过地图并有3个条目( - 3,/ 2和* 4) 现在回到顶部,我们想要三条线。这里是三行的声明:     + 5 + 6 - 2     尺寸:2      - 2     找到解决方案 - 2.它是1 3     + 6     找到+ 6的解决方案。这是2 4     不可能。

什么?相同的代码 - 读入3行,RECOGNIZED 3行,但第一个map.put实际上没有将对象放入地图。从更透视的角度来看,程序是这样的:

3 lines are read in (format: 'operator number')
You are to use the numbers 1-6 and the operator given to make the number. BUT, you can only use   each number (1-6) once in the 3 equations. The first one is fine:
* 4 - 3 / 2
Size: 3
- 3
Found solution for - 3. It's 1 4
/ 2
Found solution for / 2. It's 2 5
* 4
Not Possible.
For the first I have to use subtraction to get three. 4 - 1 is 3 so that's a pair. Now I need to use division to get 2, but I can't use 1 and 4. 6 / 3 = 2 so 6 and 3 are a pair. You get it.

这是我目前的代码:抱歉邋!! Thanks for any help...

KenKen.dat file

1 个答案:

答案 0 :(得分:3)

接下来的三行是

+ 5
+ 6
- 2

并使用运算符作为映射条目的键。 Map接口的javadoc表示重复键

  

将键映射到值的对象。地图不能包含重复的键;每个键最多可以映射一个值。

首先,您将5与密钥+放在一起,然后6+作为密钥{+, 6},这里第一个映射被覆盖。您的地图在此阅读步骤结尾处仅包含两个条目{-, 2}2,因此大小为KenKenPair

我怀疑HashMap是您在这种情况下可能要使用的数据结构。而是创建一个类class KenKenPair { final String operator; final String operand; public KenKenPair(String operator, String operand) { this.operator = operator; this.operand = operand; } public String getOperator() { return operator; } public String getOperand() { return operand; } } ,您可以在其中存储行中的每个操作数和运算符

 List<KenKenPair> list = new ArrayList<>();

并使用

String parts[] = line1.split(" ");
list.add(new KenKenPair(parts[0], parts[1]));

将它们全部收集起来,然后遍历List而不是条目集。

除此之外,请注意您对要使用的集合的选择,例如WeakHashMap中的条目可能会被删除,而不会明确地这样做。

  

WeakHashMap类的行为部分取决于垃圾收集器的操作,因此几个熟悉的(虽然不是必需的)Map不变量不适用于此类。因为垃圾收集器可能随时丢弃密钥,所以 WeakHashMap可能表现得好像未知线程正在静默删除条目。特别是,即使您在WeakHashMap实例上进行同步并且不调用其任何mutator方法,size方法也可能随着时间的推移返回较小的值,因为isEmpty方法返回false然后返回true,以使containsKey方法返回对于给定键,为true,后来为false,因为get方法返回给定键的值,但稍后返回null,put方法返回null,remove方法返回false,表示先前似乎在映射,以及对密钥集,值集合和条目集的连续检查,以便连续生成较少数量的元素。

此外,无需多次拆分同一行,而是拆分并将结果分配给局部变量:

{{1}}