2

リスト内の各オブジェクトがペアで構成される配列リストから疎行列を出力しようとしています。ペア (オブジェクト) は、位置と値の 2 つの整数を保持します。[位置、値]。

位置は、整数が配置されているスパース行列へのゼロの量です。したがって、たとえば次のような 2 次元行列として表されます。

[000 0023 100] (フォーマットについては申し訳ありません。3x3 マトリックスを想像してください)。とにかく、これの配列リストは次のようになります

aList = {[5,23], [6,1]}

現在、次のコードを使用して、それらすべてをループして 6x6 マトリックスを作成しています。

public void printFullMatrix() {

    int count = 0;
    int temp = 0;
    for (int i = 0; i < aList.size(); i++) {
        for (int j = 0; j < aList.get(i).pos - temp; j++) {
            count+=1;
            if (count % size == 0){
                System.out.println("");

            } else {
                System.out.print(0 + " ");
            }

        }
        System.out.print(aList.get(i).val + " ");
        temp = aList.get(i).pos;
    }

}

問題は、次の出力が返されることです (| 記号は改行を表します)。

[0 0 35 0 0 99 0 | 0 0 0 0 0 0 | 0 0 0 0 0 0 55| 0 0 20 0 0 0 0 | 0 0 0 3 0 0 0 | 0 0 0 0 0 2 ]

ご覧のとおり、最初の行には 7 つの要素があり、整数が出力されている行ごとに余分な 0 が追加されていることがわかりました。これは、整数がない 2 行目に表示されます。エッセイで申し訳ありませんが、私は一日中これに取り組んでいます!

返信ありがとうございます。

4

5 に答える 5

0

現在持っているものを修正する方法を見つけようとしましたが、for ループは最後のオブジェクトの値の後に続く 0 を出力しないため、マトリックス内のすべての位置を常に出力する while ループからやり直しました。これは、リストが常に位置でソートされることを前提としています。

の入力リストを使用する{[2,35], [4,99], [17,55], [19,20], [26,3], [34,2]}

int count = 0;
int currentObj = 0; // the object whose value is going to be printed
int numObjs = 6; // the number of objects to print
int size1 = 6; // number of rows
int size2 = 6; // number of positions in a row

// make sure you loop through every possible position
// the way you have it now stops after "2" is printed, leaving out the last "0"
while (count < size1 * size2) {
    count++; // increment the position every loop

    // if there are still objects to print out,
    // and if count is at the position of the current object
    //  pos of the objects is actually the number of positions before that value
    //  so pos is technically (position to print number - 1)
    if (currentObj < numObjs && (count - 1) == aList.get(currentObj).pos) {
        System.out.print(aList.get(currentObj).val + " ");
        currentObj++; // remember to increment to the next object

    // not at the position of an object's value, so print 0
    } else {
        System.out.print("0 ");
    }

    // go to the next line if size2 positions have been printed
    if (count % size2 == 0) {
        System.out.println("");
    }
}

出力:

0 0 35 0 99 0 
0 0 0 0 0 0 
0 0 0 0 0 55 
0 20 0 0 0 0 
0 0 3 0 0 0 
0 0 0 0 2 0 
于 2013-03-14T16:31:18.663 に答える
0

あなたのコードにはいくつかの問題があります。あなたの入力は次のとおりだと思います。

[2, 35] [3, 99] [17, 55] [19, 20] [26, 3] [34, 2]

まず、ゼロ以外の数値を追加するときにカウントをインクリメントしていないため、他の数値を含む行で余分なゼロを取得するのはそのためです。

次に、新しい行をチェックする必要があります (つまり、行の先頭または末尾にゼロ以外の数値を追加した場合)。

そして、これがすべて完了したら、行列の最後に残っているゼロを追加する必要があります.

次のコードが機能するはずです。

public void printFullMatrix() {

    int count = 0;
    int temp = 0;
    int rows = 0;

    for (int i = 0; i < aList.size(); i++) {
        if (count % size == 0) {
            System.out.println("");
            rows++;
        }
        for (int j = 0; j < aList.get(i).pos - temp; j++) {
            count += 1;
            if (count % size == 0) {
                System.out.println("");
                rows++;
            } else {
                System.out.print(0 + " ");
            }

        }
        System.out.print(aList.get(i).val + " ");
        temp = aList.get(i).pos;
        count++;
        if (count % size == 0) {
            System.out.println("");
            rows++;
        }
    }

    while (rows < size) {
        count++;
        if (count % size == 0) {
            System.out.println("");
            rows++;
        } else {
            System.out.print(0 + " ");
        }
    }

}
于 2013-03-14T16:09:12.193 に答える
0

2 次元配列を並べ替え (ペアと呼んでいます)、行列の長さを反復処理する方がよいと思います。ペアには行列の長さに関する情報が含まれていないため、それprintFullMatrixも同様に渡す必要があります。

1 つの追加の警告: 同じ量のゼロ インデックスを持つ 2 つのペアが存在することはない (たとえば{{5,3}, {5,4}}、決して起こらない)ため、すべての行列エントリに対してペア リストを最大1 回反復処理するだけで済みます。

これが私がそれを行う方法です:

import java.util.Arrays;
import java.util.Comparator;

public class q15413815 {

    public static void main(String[] args) {
        Integer[][] pairs = { { 6, 1 }, { 5, 23 } };
        printFullMatrix(pairs, 3);
    }

    public static void printFullMatrix(Integer[][] pairs, int length) {
        // Sort the pairs so we can simply iterate through them.
        Arrays.sort(pairs, new Comparator<Integer[]>() {

            @Override
            public int compare(Integer[] a1, Integer[] a2) {
                return a1[0] - a2[0];
            }

        });

        // Walk through the matrix and populate it with values.
        for (int i = 0; i < length * length; i++) {
            if (i % length == 0 && i != 0) {
                System.out.println();
            }

            int value = 0;
            for (int j = 0; j < pairs.length; j++) {
                if (pairs[j][0] == i) {
                    value = pairs[j][1];
                }
                if (pairs[j][0] > i) {
                    break;
                }
            }

            System.out.print(value + " ");
        }

    }
}
于 2013-03-14T16:22:30.187 に答える
0

このようなもの、私は思う...

    int[][] lll = new int[][] { {5, 23}, {6, 1}, {14, 6}};

    int count = 0;
    final int MATRIX_SIZE = 6;
    int index = 0;
    for (int pos = 0; pos < lll.length; pos++) {
        count = lll[pos][0];
        for (int i = 0; i < MATRIX_SIZE; i++) {
            index++;

            if (count == index - 1) {
                System.out.print(lll[pos][1] + " ");
            }
            else {
                System.out.print(0 + " ");
            }
        }
        System.out.print("|");
    }
}
于 2013-03-14T16:27:18.247 に答える
0

私は常に、2D 構造を印刷する最もクリーンな方法はネストされたループだと感じています。

public void printFullMatrix() {
    int mi = 0; // matrix index
    int li = 0; // list index
    for (int row = 0; row < size; row++) {
        for (int col = 0; col < size; col++) {
            System.out.printf(" %3d", 
               (li < aList.size() && mi++ == aList.get(li).pos)
               ? aList.get(li++).val : 0);
        }
        System.out.println();
    }
}
于 2013-03-14T16:53:10.917 に答える