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。
不确定这是一个简单的错误还是一个更复杂的错误。
答案 0 :(得分:2)
我想鼓励您将一些学习精力放在理解泛型和界面上。 Java在原语和值类型(如int
和Integer
)之间的转换中会很友好,但在处理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;根据需要自动转换int
和Integer
类型。例如,以下内容有效。
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)