将数组项放入带有2个字符串的hashmap中

时间:2017-04-15 19:42:32

标签: java arrays hashmap

说,我有一个类似的数组,

{"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

5 个答案:

答案 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;
}

希望这有帮助。