2016-12-04 2 views
1

私はJavaについてはかなり新しいですが、どのようにして要素のX個の空白を2Dアレイ。ここで私は何を求めていることは意味がない場合を説明するための例です:要素がJavaの2次元配列に見つかった後にX回カウントアップする方法

String[][] array = {{"1", "5", "7"}, 
        {"8", "12" "15"}, 
        {"2", "21", "16"} 
        }; 

はのは、目的の文字列が「5」であるとしましょう、私はそれを見つける方法を知っています。今度は、ユーザーが上向きに3回カウントしたい場合(0からカウントを開始)を考えてみましょう。どうすれば15の値を返すことができますか?

+0

2D配列を1D配列に変換すると、その中の任意の要素を簡単に見つけることができます。 –

+0

何が上向きで、どのようにして15が出力になると思いますか?また、あなたが試したことを私たちに見せてください。 – nullpointer

答えて

1

アレイ内の任意のスロットを通過できるアルゴリズムを見つけようとしています。 2D配列(配列のステップが配列の終わりに達すると、配列の先頭に戻ることができると仮定した場合)のように、このような問題は「モジュロ」を叫びます。

いくつかの例を実行すると、アルゴリズムを構築することができます。アレイの列に対して、アルゴリズムを使用すると、[1] [0]インデックスから出発して、あなたの例で、このアルゴリズムを用いて、上記の式に対応する値に差し込む

(currentColumn + numberOfSteps) % sizeOfRow

ように単純です次を得る:

columnIndex = (1+4)%3 = 2

今、あなたは、対応する行の値を見つけるためのアルゴリズムを考え出す必要があります。列値に対応するアルゴリズムは次のようになります

(currentRow + ((currentColumn + numberOfSteps)/sizeOfRow)) % numberOfRows

注このアルゴリズムは、Java床に整数代数を用いて分割した整数を使用したこと。これは、ステップが次の行に流れるかどうかを決定することです(列0に2ステップかかる場合は、同じ行にとどまる必要があります(0 + 2) = 0/3)あなたの例からの値に当てはめるには、次を得る:

rowIndex = 0 + ((1+4)/3)%3 = 0 + 1 = 1

注意あなたが最後のスロットを過ぎて行けばこれらのアルゴリズムは、あなたが戻って配列の先頭にループスルーをすることを前提としていること配列内にあります。一般的に、このような問題に直面した場合は、「モジュロ」と考えて、いくつかの例を見て、動作するアルゴリズムを見つけてください。

これらのアルゴリズムを使用して新しいインデックス値[1] [2]を検索すると、2D配列から対応する値を取得できます。乾杯!

0

あなたの例では、エラーのカップルがされているかのようにそれは私になります

  • は私からのカウントを開始する(最大3回行くことによって「12」
  • 後にコンマがあるべきだと思います0)私はあなたが0,1,2,3を数えて4回上がることを意味すると思う。それはまだ4回上がっている。

2次元配列が長方形(すべてのサブ配列があなたの例のように同じ長さ)であるか、不揃いであるかによって答えが異なる(たとえば、{{1 }、{2、4、6}}。私は長方形を仮定します。これはあなたの例にあるものです(そして、それは簡単です)。

問題の根本的な部分は次のとおりです。配列の配列の要素のインデックス 'm、n'を指定すると、その上のX位置の要素のインデックスであるm2とn2が見つかります。あなたの例では、m = 0、n = 1、X = 4、そしてm2を1に、n2を2にそれぞれ計算します。また、内部配列の長さも必要です。それを 'len'と呼びます。array [0] .lengthと同じです。

私はそれを行うの見る最良の方法は、以下の3つのステップである:

  1. がmのための単一の変数のインデックスを計算し、nは、神経質アウト1次元配列として配列を処理します。このインデックスを 'i'としましょう。あなたの例では、私は1で始まります( "1"は位置0に、 "5"は位置1に、 "7"は位置2に、 "8"は位置3に、 "12"は位置4に、 「15」は位置5にある)。一般的には、これは 'i = m * len + n;'という文になります。
  2. 新しい単一変数インデックスを見つけるためにXをiに追加します。あなたの例では、X = 4をi = 1に追加し、i = 5を得る。これは、所望の「15」がある場所である。
  3. 'i'の新しい値をm2とn2に変換します。 /と%:m2 = i/lenとn2 = i%lenを使ってそれを行います。あなたの例では、必要に応じてm2 = 5/3 = 1、n2 = 5%3 = 2です。

ので、全体のシーケンスは次のとおりです。

i = m*len + n; 
i += x; // I switched to lower case to conform to Java standards 
m2 = i/len; 
n2 = i%len; 

私はそれが理にかなって願っています。不揃いの配列に対処する必要があるかどうかをお知らせください。このソリューションはかなり遅く複雑になります。

関連する問題