有没有办法在整数对象中使用Java中的HashMap值执行加法/减法?

时间:2016-05-03 01:48:01

标签: java

    public static HashMap makeHashMap() {
        HashMap<String, Integer> table = new HashMap<String, Integer>();
        table.put("C", 1);
        table.put("V", 2);
        table.put("D", 3);
        table.put("W", 4);
        table.put("E", 5);
        table.put("F", 6);
        table.put("X", 7);
        table.put("G", 8);
        table.put("Y", 9);
        table.put("A", 10);
        table.put("Z", 11);
        table.put("B", 12);
        // System.out.print(table);

        return table;
    }

    public static ArrayList<Object> makeArrayList(HashMap<String, Integer> table) {
        Object[] keys = table.keySet().toArray();
        ArrayList<Object> randomlyGeneratedNotes = new ArrayList<Object>();
        for (int i = 0; i < 83; i++) {
            Object key = keys[new Random().nextInt(keys.length)];
            //  System.out.println(key + " " + table.get(key));
            randomlyGeneratedNotes.add(key);
        }
        System.out.println(randomlyGeneratedNotes);
        return randomlyGeneratedNotes;
    }

    public static void pitchMovement(ArrayList<Object> randomlyGeneratedNotes, HashMap table) {
      Iterator<String> keySetIterator = table.keySet().iterator();
        String key = keySetIterator.next();
        int first = table.get(key);

        for (Object o : randomlyGeneratedNotes) {
            //you want to grab the values of 2 neighboring keys
            if (table.containsKey(o)) {
              //  System.out.println("true");
                Object firstNote=  table.get(key);
                System.out.println(firstNote);
            }
        }
    }
}

如何在HashMap值之间执行加/减?或者我使用了不适当的数据结构?我尝试使用pitchMovement方法执行某些操作,但int first = table.get(key);行会出现不兼容类型的错误:

  

对象无法转换为int。

不确定这是一个简单的错误还是一个更复杂的错误。

3 个答案:

答案 0 :(得分:2)

我想鼓励您将一些学习精力放在理解泛型和界面上。 Java在原语和值类型(如intInteger)之间的转换中会很友好,但在处理Object类型的对象时会起到愚蠢的作用。您在多个地方遇到的问题是,您不必要地将强类型值降级为Object类型。

我建议进行以下更改:

public static HashMap makeHashMap()更改为public static HashMap<String,Integer>。否则,您将获得相当于HashMap<Object,Object>的相当于您不想要的内容。

public static ArrayList<Object> makeArrayList(HashMap<String, Integer> table)中,您从HashMap中提取String类型的键,然后在构建阵列时将其转换为Object类型。不要改变他们的类型 - 将他们保持为String。你可能被#34; toArray()&#34;转换为Object值的数组。您可以使用此技术来保留类型:

    String[] keys=new String[table.size()];
    keys=table.keySet().toArray(keys);

通过这样做,您可以轻松更改makeArrayList的签名以返回类型为String的ArrayList:

  public static ArrayList<String> makeArrayList(HashMap<String, Integer> table)

您的pitchMovement签名可以更改为:

  public static void pitchMovement(ArrayList<String> randomlyGeneratedNotes,
                                   HashMap<String,Integer> table)

请注意,您遇到的与HashMap table相关的特定错误没有通用参数(相当于HashMap<Object,Object>)。

如果您的类型尚未缩减为Object,那么Java将使用&#34;自动装箱&#34;根据需要自动转换intInteger类型。例如,以下内容有效。

    Integer x=new Integer(5);
    int y=10+x;
    Integer z=x+y;

总而言之,数学运算将按照您的预期运行,无需您在原语及其等效值类型之间进行转换和转换,无论您在何处存储它们,但您必须努力保持这些类型保存在任何地方你使用它们。

答案 1 :(得分:1)

尝试 整数first = table.get(key);

由于table是String和Integer的映射,您可以将值作为Integer获取。 然后,您可以将Integer变量转换为int。

答案 2 :(得分:1)

您需要使用通用参数更新方法签名:

public static void pitchMovement(ArrayList<Object> randomlyGeneratedNotes, HashMap<String, Integer> table)