【问题标题】:Adding up several lists horizontally水平添加多个列表
【发布时间】:2014-02-05 11:36:09
【问题描述】:

我有一个对象列表。每个对象都有一个列表。我想要做的是将这些对象水平添加到一个新列表中,使其看起来像这样:

目前我正在努力寻找合适的算法,所以我编写了这个小测试程序:

public class testClass {

    /**
     * @param args
     */
    public static void main(String[] args) {

        List<Double> list1 = new ArrayList<Double>();
        List<Double> list2 = new ArrayList<Double>();
        List<Double> list3 = new ArrayList<Double>();
        List<List<Double>> objectList = new ArrayList<List<Double>>();

        //add data
        list1.add(1.0);
        list1.add(2.0);
        list1.add(3.0);
        list1.add(4.0);
        list1.add(5.0);
        list1.add(6.0);
        list1.add(7.0);

        list2.add(1.0);
        list2.add(2.0);
        list2.add(3.0);
        list2.add(4.0);
        list2.add(5.0);
        list2.add(6.0);
        list2.add(7.0);

        list3.add(1.0);
        list3.add(2.0);
        list3.add(3.0);
        list3.add(4.0);
        list3.add(5.0);
        list3.add(6.0);
        list3.add(7.0);

        objectList.add(list1);
        objectList.add(list2);
        objectList.add(list3);

        double result = 0.0;
        List<Double> resultList = new ArrayList<Double>();
        for (int i = 0; i < objectList.size(); i++) {
            for (int j = 0; j < objectList.get(i).size(); j++) {
                result =+ objectList.get(i).get(j);
            resultList.add(result);
            }
        }

        System.out.println(resultList.toString());
    }

}

但是,我目前得到的是:

[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0]

关于如何解决该问题以从图片中获得所需输出的任何建议?

感谢您的回答!

更新

更改为+= 运算符我得到:

[1.0, 3.0, 6.0, 10.0, 15.0, 21.0, 28.0, 29.0, 31.0, 34.0, 38.0, 43.0, 49.0, 56.0, 57.0, 59.0, 62.0, 66.0, 71.0, 77.0, 84.0]

列表大小增加了两倍。如何横向添加元素?

【问题讨论】:

  • @SubhrajyotiMajumder 你是什么意思?
  • 你提到了=+的代码,但是你提到了+=
  • @SubhrajyotiMajumder 是的,但我根本没有更改代码。我只改了update section

标签: java algorithm list loops


【解决方案1】:

你犯了一个非常小的错误。没有像=+ 这样的运算符。而是+=

result += objectList.get(i).get(j);

result =+ objectList.get(i).get(j); 所做的是将objectList.get(i).get(j) 的正数(+) 分配给结果。

而且,您还没有向resultList 添加任何内容,这就是它打印空列表的原因。在打印出来之前,你需要在这个列表中添加一些数据。

编辑: 要水平添加它们,您根本不需要双 for 循环。一个 for 循环就可以了。

for (int j = 0; j < list1.size(); j++) { // assuming all lists are of same size
    result = list1.get(j) + list2.get(j) + list3.get(j);
    resultList.add(result);
}

Edit2: 由于您有很多列表(38, 000 个),您可以尝试这种方法。您需要在每个内部 for 循环完成后(添加一行元素)而不是在每次添加(添加每个元素)之后将结果添加到结果集中,然后将值重置为 0.0。这也解释了为什么没有。 resultList 中的元素数量增加了两倍。

double result = 0.0;
List<Double> resultList = new ArrayList<Double>();
for (int j = 0; j < objectList.get(0).size(); j++) { // assuming all lists are of same size
    for (int i = 0; i < objectList.size(); i++) {
        result += objectList.get(i).get(j);
    }
    resultList.add(result);
    result = 0.0;
}

【讨论】:

  • 感谢您的回答!但是我仍然没有得到我想要的结果。请看我的更新!
  • 感谢您的回答!基本上我也会这样实现它。但是我有一个程序,如果我有超过 38000 个列表,这根本不可能......
  • 不会结果 = list1.get(j) + list2.get(j) + list3.get(j);将 3 个值的总和添加到 1 个列表点?而不是向每个点水平添加一个值?
  • 是的,但这确实可以完成这项工作。从 list1 到 list 38000 我不能通过列出它们来做到这一点......
  • @user2051347 - 我尝试了新的编辑 2,它对我有用。看看这个! :)
猜你喜欢
  • 1970-01-01
  • 2012-08-06
  • 2020-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多