Java:将ArrayList元素显示为2d ArrayList中的列

时间:2013-09-17 20:51:37

标签: java arraylist

我有一个像这样的ArrayList:

ArrayList<ArrayList<Double>> someArray = new ArrayList<ArrayList<Double>>();

它的值如下:

[1,3,2,1,3,4,5,5],[7,2,1,3,4,5,4,2,4,3],....

我希望输出看起来像这样:

1 7 . . .
3 2 
2 1
1 3
.
.
.

,ArrayList中的每个列表都应显示为一列。 我尝试了各种方法,但代码将它们显示在行中..

for(int i=0;i<someArray.size();i++){
    System.out.println(someArray.get(i));
}

看起来很简单但无法弄明白: - !

3 个答案:

答案 0 :(得分:8)

你需要两个循环 - 一个循环通过内部ArrayList,一个循环通过内部int maxSize = 0; for (ArrayList<Double> innerList : someArray) { if (maxSize < innerList.size()) { maxSize = innerList.size(); } } for (int i = 0; i < maxSize; i++) { for (ArrayList<Double> innerList : someArray) { //You don't need this if all lists are the same length. if (i > innerList.size() - 1) { System.out.print("x "); } else { System.out.print(innerList.get(i) + " "); } } System.out.println(); //new line for the next row } 。你也不知道最大的列表有多长(除非你假设它们的大小都相同)。

您必须逐行打印,因此您需要迭代给定索引处的所有列表并将它们打印在同一行上。

{{1}}

答案 1 :(得分:3)

这适用于我的测试。它打印出来了:

5.5 2.5 2.5 
6.5 3.5 x 
x 4.5 x 
x x x 

现在算法:

package com.sandbox;


import java.util.ArrayList;

public class Sandbox {

    public static void main(String[] args) {
        ArrayList<ArrayList<Double>> someArray = new ArrayList<ArrayList<Double>>();
        someArray.add(new ArrayList<Double>());
        someArray.get(0).add(5.5);
        someArray.get(0).add(6.5);
        someArray.add(new ArrayList<Double>());
        someArray.get(1).add(2.5);
        someArray.get(1).add(3.5);
        someArray.get(1).add(4.5);
        someArray.add(new ArrayList<Double>());
        someArray.get(2).add(2.5);

        boolean elementsLeft = true;
        int column = 0;
        while (elementsLeft) {
            for (ArrayList<Double> subList : someArray) {
                if (subList.size() > column) {
                    System.out.print(subList.get(column) + " ");
                }else {
                    System.out.print("x ");
                }
            }
            System.out.println();

            elementsLeft = isElementsLeft(someArray, column);
            column++;
        }
    }

    private static boolean isElementsLeft(ArrayList<ArrayList<Double>> someArray, int column) {
        for (ArrayList<Double> subList : someArray) {
            if (subList.size() > column) {
                return true;
            }
        }
        return false;
    }
}

答案 2 :(得分:1)

您希望循环嵌套列表,而不是外部列表。

//Make sure at least 1 list to avoid a null reference on the next line
if(someArray.size() > 0) {
    //Assuming that all the nested lists are the same length
    for(int i = 0; i < someArray.get(0).size(); i++) {
        for(ArrayList<Double> nestedList : someArray) {
            if(list != someArray.get(0))
                System.out.print(" ");
            System.out.print(nestedList.get(i));
        }
        System.out.print("\n");
    }
}

修改

我认为这个问题包含了一个错误,这个错误来自某人急忙想出一个例子。如果它们的长度可变,请参阅ggmathur的答案。


修改编辑:

好的,我正在将自己的实现完整性化。

String spacer = "X";
int maxSize = 0;
for(ArrayList<Double> nestedList : someArray)
    maxSize = (maxSize > nestedList.size()) ? maxSize : nestedList.size();

if(maxSize > 0) {
    for(int i = 0; i < maxSize; i++) {
        if(list != someArray.get(0))
            System.out.print(" ");
        System.out.print(nestedList.size() >= i ? nestedList.get(i) : spacer);
    }
    System.out.print("\n");
}