说,我有一个类似的数组,
{"A", "1", "B", "2", "C", "3"}
我想把它变成HashMap
对象,我尝试了几种方法,但似乎都没有效果。
我创建了一个方法isDigit()来检查项目是否为数字,
private static boolean isDigit(String str){
try {
Integer.parseInt(str);
}
catch (NumberFormatException nfe){
return false;
}
return true;
}
然后我尝试分成2个数组,数字和字母。
for (int i = 0; i <= parts.length; i++) {
if (isDigit(parts[i])) {
numbers[i] = parts[i];
} else {
abcs[i] = parts[i];
}
}
最后,
for (int i = 0; i < numbers.length ; i++) {
map.put(abcs[i], numbers[i]);
}
我打印出来,
for (String each: map.keySet()) {
System.out.println(each + ":" + map.get(each));
}
打印类似的内容,
1
A : null
2
B : null
应该打印的是,
A : 1
B : 2
C : 3
答案 0 :(得分:2)
问题在于你的for循环:
for (int i = 0; i <= parts.length; i++) {
if (isDigit(parts[i])) {
numbers[i] = parts[i];
} else {
abcs[i] = parts[i];
}
}
你正在从0迭代到5,所以你要将valies放入偏移1的索引中。它是这样的:abcs [0] - &gt;数字[1] - &gt; abcs [2] - &lt;数[3]。一个更简单的解决方案是使用列表并使用add方法。
答案 1 :(得分:2)
为什么不通过递增parts
s中的循环计数器来成对遍历2
:
for (int i = 0; i < parts.length -1; i += 2) {
map.put(parts[i], parts[i + 1]);
}
答案 2 :(得分:1)
你不均衡地迭代阵列。
for (int i = 0; i <= parts.length; i++) {
if (isDigit(parts[i])) {
numbers[i] = parts[i];
} else {
abcs[i] = parts[i];
}
}
假设isDigit()正在运行,您正在创建两个阵列,但在创建它们时它们不是按顺序排列。
所以当i == 0时,isDigit(parts [0])为false,所以你创建了abcs [0] = parts [0],但你在abcs中创建的下一个项目不是abcs [1] ,它是abcs [2],因为当它是一个数字时你跳过了1。
答案 3 :(得分:0)
您的案例中存在索引问题。虽然查看输入类型,但还有其他方法(One such way is mentioned in an another answer)可以执行此操作,但我正在编辑您的代码,以便它可以按照您的意图运行。
int inputLength = parts.length; // assuming it is always even as it contains a pair (alphabet, number)
int[] numbers = new int[inputLength/2];
char[] abcs = new char[inputLength/2;
int keyIndex = 0;
int valueIndex = 0;
for (int i = 0; i <= parts.length; i++) {
if (isDigit(parts[i])) {
numbers[keyIndex] = parts[i];
keyIndex++;
} else {
abcs[valueIndex] = parts[i];
valueIndex++;
}
}
答案 4 :(得分:0)
正如其中一个答案Your iterating over the array unevenly中提到的,问题在于循环中的索引。
但我还要指出,您在方法isDigit(String str)
中以错误的方式使用异常处理
对控制流使用异常处理被认为是一种不好的做法。关于这个主题的问题的一个很好的答案是:Exceptions as control flow
我会将你的方法重构为:
private static boolean isDigit(String str){
if (Character.isDigit(str.charAt(0))) { //assuming that the length of str is always 1
return true;
}
return false;
}
希望这有帮助。