「アミーゴ、もうプログラミングにおいて配列がいかに便利か理解できたと思いますが?」
「間違いなく、リシ! 私はすでに複数の課題を解決しました。」
「あなたのタスクには反復的なアクションが含まれていましたか? 何度も繰り返し行ったようなものです。」
「私の理解が正しければ、異なるタスクでも同様のアクションを意味しているのですか? たとえば、配列の内容を表示するためにループを使用するあらゆる場所で、そんなことをするのはとてもうんざりします!」
「はい、それが言いたいことです。Java の作成者は、Java プログラマーが配列を扱うときに同じコードを書くことが多いことに気づきました。たとえば、配列の一部を別の配列にコピーするコードや、配列の各セルに同じものを埋めるコードなどです。値またはあなたの例: 配列の内容を画面上に読み取り可能な形式で表示するコード。
「そして、本物のプログラマーには非常に重要なルールが 1 つあります。同じことを繰り返さないことです。余分な仕事をするのは間違っていることに同意するでしょう。その対価は支払われません。効果的な仕事には十分な報酬が与えられます。信じてください。ちなみに、初心者の場合コードは大量の繰り返しコードによってすぐに認識できます。
「Java の作成者はこれを熟考し、最も一般的な配列関連のアクションを組み込んだ特別なArrays
クラス (正式名は) を作成しました。」java.util.Arrays
「うーん...とても興味深いですね。それでは具体的には何があるのですか?」
「あらゆる場面に対応する多くの方法がありますが、最初はそのうちの最も単純で最も頻繁に使用される 10 個だけを検討します。
Arrays.toString()
「最初に検討する方法は ですArrays.toString()
。しかし、その前に少し背景を説明します。
「Java の各配列にはtoString()
、「配列のテキスト表現」を返すメソッドがあります。次のステートメントを使用して、配列のテキスト表現を取得できます。
String str = name.toString();
「name
配列変数の名前はどこにあり、str
配列の文字列表現を格納する変数の名前はどこにありますか。アミーゴ、メソッドを使用して配列を画面に出力してみましたか?」System.out.println(name)
私は告白します、それは実際に起こりました。意味不明なものを見ました。私は危害を加えないようにし、ループを使い続けることにしました。
「おそらく次のようなものを見たことがあるでしょう。
I@37afeb11
「最初の文字は配列I
であることを意味しint
、その後の記号は@
メモリ内の単一オブジェクトのアドレスです。メモリ内の配列のアドレスと考えることができます。一方で、これはまさに、配列変数ですが、一方では違うものを期待していましたよね?」
「その通りです。配列内の値を確認するつもりでした。これは予想外でした。」
Arrays.toString()
「そしてまさにそれが、彼らが配列の値を表示するメソッドを思いついた理由です。私たちはそれを次のように呼び出します。
String str = Arrays.toString(name);
例:
|
変数str には文字列が含まれます"[1, 2, 3]" |
|
変数str には文字列が含まれます"[]" |
|
変数str には文字列が含まれます"[Hi, How's, life?]" |
Arrays.deepToString()
「しかし、このtoString()
メソッドは 2 次元配列に関しては適切ではありません。言い換えれば、 を呼び出そうとするとArrays.toString()
、見慣れたものが表示されるでしょう。
[I@37afeb11, I@37afeb21, I@37afeb31]
「これはすべて、2 次元配列のセルが 1 次元配列への参照を格納しているためです。そして、1 次元配列はどのように文字列に変換されるのでしょうか? まさに上で見たとおりです。
「それではどうすればよいでしょうか? 2 次元配列を正しく表示するにはどうすればよいでしょうか?」
「Java の作成者もこれを予想していました。この目的のために、Arrays
クラスには別の特別なメソッドがあります — deepToString()
。それを呼び出すと次のようになります。
String str = Arrays.deepToString(name);
「このメソッドには、2 次元、1 次元、3 次元、または一般に任意の次元の配列を渡すことができ、常に配列の要素が表示されます。
例:
|
変数str には文字列が含まれます"[1, 2, 3]" |
|
変数str には文字列が含まれます"[[1, 1], [2, 2], [3, 3]]" |
|
変数str には文字列が含まれます"[[[1, 2, 3], [1]], [[]]]" |
Arrays.equals()
「画面上に配列を表示する方法を考え出しました。配列の比較についてはどうでしょうか? 文字列の比較にどのような方法を使用できるか覚えていますか?」
「私は普段このequals
方法を使っています!
「はい、、、equals
またequalsIgnoreCase
(大文字と小文字に関係なく文字列を比較します)。
「良いニュース: このメソッドは配列にも使用できますequals
。悪いニュース: このメソッドは配列の内容を比較しません。equals
配列のメソッドは演算子と同じことを行い==
、参照を比較します。
例:
|
false (参照が等しくない) |
|
2 つの配列の参照を単純に比較するequals 方法。(参照が等しくない)arrays false |
「では、何をすればよいでしょうか? 配列の内容に基づいて配列を比較するにはどうすればよいでしょうか?」
「ここでもArrays
クラスが役に立ちます。より具体的には、そのArrays.equals()
メソッドです。これを次のように呼び出します。
Arrays.equals(name1, name2)
「true
配列の長さが等しく、その要素が等しい場合、メソッドは を返します。それ以外の場合、メソッドは を返しますfalse
。」
例:
|
2 つの配列の参照を単純に比較するequals 方法。(参照が等しくない)arrays false |
|
true (内容は同等です) |
|
false (配列の内容が異なります) |
Arrays.deepEquals()
「そして、おそらくすでにご想像のとおり、このArrays.equals
メソッドは 2 次元配列に対しては正しく機能しません。2 次元配列を、要素が 1 次元配列のアドレスである 1 次元配列のように扱います。
「そこで、多次元配列 ( n = 1, 2, 3,...
) を正しく比較するために、彼らはこのメソッドを思いつきましたArrays.deepEquals()
。それを呼び出すと次のようになります。
Arrays.deepEquals(name1, name2)
"このメソッドは、true
配列の長さが同じで要素が等しい場合に戻ります。そうでない場合は戻ります。false
。配列内の要素も配列である場合は、Arrays.deepEquals()
メソッドがそれらの比較に使用されます。
例:
|
2 つの配列の参照を単純に比較するequals 方法。(参照が等しくない)arrays false |
|
このメソッドは、 と を参照を格納する 1 次元配列としてArrays.equals 比較します。それらにはさまざまな参照が含まれています。(配列の内容は等しくない) x1 x2 false |
|
true (内容は同等です) |
「ありがとう、リシ! このレッスンは、将来の私の人生をより楽にして幸せにするために必要なものです。これから Arrays クラスのメソッドを使用して、プログラムをさらに速く書いていきます。
「それが私が期待していたものです、はは。しかし、Arrays クラスの興味深いメソッドはこれだけではありません。他のメソッドについては次回お話します。」
GO TO FULL VERSION