2

我有一个这样的 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));
}

看起来很简单,但无法弄清楚:-!

4

3 回答 3

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
}
于 2013-09-17T21:09:57.580 回答
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;
    }
}
于 2013-09-17T20:56:57.310 回答
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");
}
于 2013-09-17T21:09:18.707 回答