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 内の各リストは 1 つの列として表示する必要があります。さまざまな方法を試しましたが、コードはそれらを行に表示します..

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

シンプルに見えますが、理解できません:-!

4

3 に答える 3

8

2 つのループが必要です。1 つは内側を通過し、ArrayListもう 1 つは外側を通過します。また、最大のリストの長さもわかりません (すべて同じサイズであると仮定しない限り)。

行ごとに印刷する必要があるため、特定のインデックスですべてのリストを繰り返し処理し、同じ行に印刷する必要があります。

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 に答える