質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.03%

2次元配列から要素を抜き出す範囲を決める2点を返したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,764

score 14

Javaで1次元配列のデータを2次元配列に並べ替え、置き換えた2次元配列から、2点を定めその中の範囲を、再び1次元配列に並べ替えるプログラミングをしております。

class namadata {
    public static void motodata () {
        byte [] data = new data[120] { 1, 2 ,3,…,120};
    }
}

class data2D {
    public static void nijigenka(byte[] data,byte[][] data2D) {
        for(byte i = 0; i < 10; i++) {          // タテとする
            for(byte j = 0; j < 12; j++) {  // ヨコとする
                data2D[i,j] = data[i * 12 + j];
            }
        }
    }
}

上記のように元データの1次元配列を2次元配列化しました。その中から2点を選び、2点中の範囲のデータを再び1次元配列に置き換えたいと考えています。

例えば選んだ2点の座標がそれぞれ{1,2}{3,5}とします。
その場合、1次元配列に置き換える対象となる要素は{{1,2}{1,3}{1,4}{1,5}{2,2}{2,3}{2,4}{2,5}{3,2}{3,3}{3,4}{3,5}}となるようにしたいのです、そして再び1次元配列化したいです。

そのため選ぶ2点の座標を、引数として返し、メインメソッドでそれぞれの座標を入力できるようなメソッドしたいのですが、どのようにコーディングしていいのかよくわかりません。わからないなりに書いたコードは以下のコードです。

class Pickdata {
    public static void pdata() {
        for(byte y = y1; y < y2; y++) {        // y2は2点のうち大きい方、y1は小さい方のタテ座標
            for(byte x = x1; x < x2; x++) {    // // x2は2点のうち大きい方、x1は小さい方のヨコ座標
                data[x * 12 + y] = pdata[x, y];
            }
        }
    }
}

あまりに初心者ゆえ、いろいろとおかしなことを言っているかと思いますが、一緒に考えてくださるととてもうれしいです。どうぞよろしくお願い致します。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

まずこれらを別クラスに分ける必然性は見られないので,1つのクラスに実装します.
それぞれのメソッドについて考えましょう.
まず最初の配列初期化はこれではダメで,その後の{}を使ったやり方もコードが長くなりすぎるので,
forで回して初期化します.
byte[] data = new byte[120];
for(int i = 0; i < 120; i++){
    data[i] = (byte)(i + 1);
}
次に,2次元配列を用意して並び替えをします.インデックスをいちいち計算するのはロスが大きいので,インデックス値をインクリメントして入れていきます.
byte[][] data2D = new byte[10][12];
int n = 0;
for(int i = 0; i < 10; i++){
    for(int j = 0; j < 12; j++){
        data2D[i][j] = data[n];
        n++;
    }
}
これをメソッドとして切り出す場合は,必要な情報はもとのdataで,結果を2次元配列で返せばいいので,
public static byte[][] nijigenka(byte[] data){
    //上のコードが入る
    return data2D;
}
こうなります.
主題の「特定範囲の数値を取り出して1次元化」ですが,開始地点と終了地点がわかればその中のデータ数が確定するので,その数で配列を初期化します.あとは範囲内の数値を取り出して格納していくだけです.
public static byte[] pickData(byte[][] target, int startX, int startY, int endX, int endY){
    byte[] result = new byte[(endX - startX + 1) * (endY - startY + 1)];
    int n = 0;
    for(int i = startY; i < endY; i++){
        for(int j = startX; j < endX; j++){
            result[n] = target[i][j];
            n++;
        }
    }
    return result;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る