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);
行给出了不兼容类型的错误:
Object cannot be converted to int.
不确定这是一个简单的错误还是一个更复杂的错误。
最佳答案
我想鼓励您付出一些学习努力来理解泛型和接口(interface)。 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)
,您正在提取 String
从 HashMap 中键入键,然后将它们转换为类型 Object
构建阵列时。不要更改它们的类型——将它们保留为字符串。您可能被“toArray()”转换为 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 将使用“自动装箱”在您的 int
之间自动转换和 Integer
根据需要类型。例如,以下是有效的。
Integer x=new Integer(5);
int y=10+x;
Integer z=x+y;
总而言之,无论您将它们存储在何处,数学运算都将按照您的预期进行,而无需在基元及其等效值类型之间进行强制转换和转换,但是您必须努力在您使用的任何地方保留这些类型他们。
关于java - 有没有办法在 Integer 对象中用 Java 中的 HashMap 值执行加法/减法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36994316/