将两个列表合并到一个新列表中,索引到相同的索引,而不是添加到长度

时间:2014-09-06 16:33:58

标签: java list hashmap

我试图将两个列表合并到一个新列表中,两个列表的所有值都保持与原始索引相同的索引,而不是添加到新列表长度。 列表A在随机索引中包含一个数字,一些为空,数字在1-3之间。 列表B包含所有索引上的数字123。 我尝试使用for循环和列表添加,但随后它给了我一个indexoutofbounds,因为它似乎列表add在添加值时推送列表的内容。我现在正在尝试使用hashmap:

列表:

Int arraylength = 10;

ArrayList<Integer> mergeballs = new ArrayList<>(arraylength); // merging list A
// contenent: null,3,null,null,2,3,null,1,null,2

ArrayList<Integer> hats = new ArrayList<>(arraylength); // merging list B
//contenent: 123,123,123,123,123,123,123,123,123,123


ArrayList<Integer> hatsMerged = new ArrayList<Integer>(arraylength); // A & B merged
for (int o = 0; o < stickarray.length; o++) {
    HashMap<Integer, Integer> map = new HashMap<Integer, Integer (arraylength);
    map.put(o, hats.get(o) + mergeballs.get(o));
    hatsMerged.add(o,map.get(o));
    System.out.print(hatsMerged.get(o));
}

使用这段代码我也得到一个超出范围的索引和帽子和合并球正在得到总结,这是我不想要的。我希望它是:123,1233,123,123,1232,1233,123,1231,123,1232

我该怎么做?并且hashmap是最佳选择吗?

2 个答案:

答案 0 :(得分:4)

这是一种做你似乎要求的方法。忽略null,将int转换为String - 然后将其他int连接到String并转换回int进行存储在合并的List<Integer>中。像,

public static List<Integer> merge(List<Integer> a, List<Integer> b) {
    List<Integer> al = new ArrayList<>();
    for (int i = 0; i < a.size(); i++) {
        Integer val = a.get(i);
        StringBuilder sb = new StringBuilder();
        if (val != null) {
            sb.append(val);
        }
        Integer bv = b.get(i);
        if (bv != null) {
            sb.append(bv);
        }
        try {
            al.add(Integer.parseInt(sb.toString()));
        } catch (NumberFormatException nfe) {
            nfe.printStackTrace();
        }
    }
    return al;
}

public static void main(String[] args) {
    List<Integer> a = Arrays.asList(123, 123, 123, 123, 123, 123, 123, 123,
            123, 123);
    List<Integer> b = Arrays.asList(null, 3, null, null, 2, 3, null, 1,
            null, 2);
    List<Integer> merged = merge(a, b);
    System.out.println(merged);
}

输出(请求的) -

[123, 1233, 123, 123, 1232, 1233, 123, 1231, 123, 1232]

答案 1 :(得分:0)

您无需使用散列图。您可以检查空值并用零替换并添加,从而合并两个列表之间的值。通过将mergeballs.get(0)分配给Integer局部变量并在条件表达式中使用它,可以避免2次调用。

    Integer result;
    ArrayList<Integer> hatsMerged = new ArrayList<Integer>(arraylength); // A & B merged
    for (int o = 0; o < arraylength; o++) {
        result = ((mergeballs.get(o) == null) ? 0 : mergeballs.get(o)) + ((hats.get(o) == null) ? 0 : hats.get(o));
        hatsMerged.add(result);
        System.out.print(hatsMerged.get(o));
    }