0

2つ以上の列(たとえば、A、B、C)のテーブルがあります。1つの列にいくつかの数値(C)があり、グループ化のような「group by」を実行して、Cの数値を合計したいのですが、そのためのアルゴリズムがわかりません。

テーブルを各列で並べ替えてみました(数字の列(C)を除いて、最後から最初まで、この場合はsort(B)、次にsort(A))、次に、n行がAで同じ値を保持する場所Bは、th行と同様に、th行からth行(C列)にn-1番号を追加してから、 th行を削除します。それ以外の場合、行のAまたはBの値が、行のAまたはBの値と異なる場合は、次の行に移動します。次に、テーブルの最後の行までアルゴリズムを繰り返します。しかし、どういうわけか、これは常に機能しているわけではありません。特に、列の数が多い場合(並べ替え方法が原因で、一部の行がグループ化されないままになっている場合があります)。nn-1nnn-1

これが適切なグループ化アルゴリズムであるかどうかを知りたいので、問題を並べ替え方法で探す必要があります。または、別の(並べ替えおよび/またはグループ化)アルゴリズムを使用する必要があります。ありがとうございました。

LE:どうやら、私が使用したアルゴリズムは、コードを徹底的にチェックし、私のようなジュニアプログラマーがよく犯す小さな間違いを修正した後でもうまく機能しているようです:)

4

2 に答える 2

2

これを行う良い方法は、行をクラスにラップし、equalsメソッドを実装してから、Mapを使用して値を加算することだと思います。

public class MyRow {
    private Long columnA;
    private String columnB;
    private int columnC;

    @Override
    public boolean equals(final Object other) {
        if (!other instanceof MyRow) {
            return false;
        }
        final MyRow otherRow = (MyRow) other;
        return this.columnA.equals(otherRow.getColumnA()) && this.columnB.equals(otherRow.getColumnB);
    }
}

次に、すべての行を反復処理して、Cの合計を保持するためのマップを作成できます。

final Map<MyRow, Integer> computedCSums = new HashMap<MyRow, Integer>();

for (final MyRow myRow : myRows) {
    if (computedCSums.get(myRow) == null) {
        computedCSums.put(myRow, myRow.getColumnC());
    } else {
        computedCSums.put(myRow, computedSums.get(myRow) + myRow.getColumnC());
    }
}

次に、任意の行のグループ化されたCの合計を取得するには、次のようにします。

computedCSum.get(mySelectedRow);
于 2012-09-20T12:39:57.610 に答える