1.Arrays.fill()

配列を扱うとき、Java プログラマーは配列に同じ値を入力する必要があることがよくあります。もちろん、ループを作成して、ループ内の配列の各セルに何らかの値を割り当てることもできます。

int[] x = new int[100];
for (int i = 0; i < x.length; i++)
x[i] = 999;

あるいはArrays.fill()、単純にメソッドを呼び出すこともできます。このメソッドはまったく同じことを行い、渡された配列に渡された値を格納します。その様子は次のとおりです。

Arrays.fill(name, value)

上記の例のコードは、もう少しコンパクトでわかりやすくすることができます。

int[] x = new int[100];
Arrays.fill(x, 999);

Arrays.fill()このメソッドを使用して、配列全体ではなく、配列の一部に値を入力することもできます。

Arrays.fill(name, first, last, value)

ここで、 first と last は、入力される最初と最後のセルのインデックスです。

Java の古き良き伝統に従って、最後の要素は範囲に含まれないことに注意してください。

例:

int[] x = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

Arrays.fill(x, 3, 7, 999);


String str = Arrays.toString(x);


セルx[3]x[4]x[5]x[6]に値 を入力します999。配列のセルには 0 から始まる番号が付けられます。

変数strには次の値が含まれます。
"[1, 2, 3, 999, 999, 999, 999, 8, 9, 10]"

このArrays.fill()メソッドは 1 次元配列でのみ機能します。2 次元配列をメソッドに渡すと、その後のすべての結果とともに 1 次元として扱われます。



2.Arrays.copyOf()

すでにご存知のとおり、配列の作成後にサイズを変更することはできません。

しかし、本当にそうしたい場合はどうすればよいでしょうか?

まあ、本当にそうしたいなら、できるよ!

  • 必要な長さの新しい配列を作成します
  • 最初の配列のすべての要素をそこにコピーします。

ちなみに、これはまさにこのArrays.copyOf()メソッドが行うことです。これを呼び出すと次のようになります。

Type[] name2 = Arrays.copyOf(name, length);

このメソッドは既存の配列を変更しませんが、代わりに新しい配列を作成し、古い配列の要素をそこにコピーします。

要素が適合しない場合 (長さが既存の配列の長さより短い場合)、余分な値は無視されます。

新しい配列の長さが古い配列の長さより長い場合、セルはゼロで埋められます。

例:

int[] x = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

int[] x2 = Arrays.copyOf(x, 5);
String str2 = Arrays.toString(x2);

int[] x3 = Arrays.copyOf(x, 15);
String str3 = Arrays.toString(x3);


変数str2には次の値が含まれます。
"[1, 2, 3, 4, 5]"

変数str3には次の値が含まれます。
"[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0]"

3.Arrays.copyOfRange()

また、長さ 10 の配列から長さ 5 の配列を取得したいが、その配列に最初の 5 要素ではなく最後の 5 要素を含める必要がある場合はどうなるでしょうか。

この場合、Arraysクラスの別のメソッドであるArrays.copyOfRange(). これを呼び出すと次のようになります。

Type[] name2 = Arrays.copyOfRange(name, first, last);

このメソッドも新しい配列を作成しますが、元の配列の任意の場所の要素をその配列に埋めます。ここで、 first と last は、新しい配列に入れる必要がある最初と最後の要素のインデックスです。

Java の古き良き伝統に従って、最後の要素は範囲に含まれないことに注意してください。

例:

int[] x = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20};

int[] x2 = Arrays.copyOfRange(x, 5, 10);
String str2 = Arrays.toString(x2);

int[] x3 = Arrays.copyOfRange(x, 5, 15);
String str3 = Arrays.toString(x3);


変数str2には次の値が含まれます。
"[16, 17, 18, 19, 20]"

変数str3には次の値が含まれます。
"[16, 17, 18, 19, 20, 0, 0, 0, 0, 0]"


4.Arrays.sort()

ああ、最もおいしいご馳走は、仕分けです。配列はプログラミングにおいて頻繁にソートされます。配列を操作するときに最も一般的なアクションは次の 3 つです。

  • 配列のソート
  • 配列の最小 (または最大) 要素を見つける
  • 配列内の要素のインデックスを決定する (配列内の要素を検索する)

これがまさに、Java の作成者がこのsort()メソッドをクラスに含めた理由ですArrays。これを呼び出すと次のようになります。

Arrays.sort(name);

このメソッドは、渡された配列を昇順にソートします。

例:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};

Arrays.sort(x);

String str = Arrays.toString(x);



変数strには次の値が含まれます。
"[-20, -20, -20, -2, 0, 3, 8, 11, 99, 999]"

素晴らしいですよね?1 つのメソッドを呼び出したので、ソートされた配列が完成しました。美しい。

ちなみに、この方法を使用すると、配列全体だけでなく、配列の一部だけを並べ替えることもできます。これを呼び出すと次のようになります。

Arrays.sort(name, first, last);

firstlast は、並べ替えの対象となる最初と最後のセルのインデックスです。

Java の古き良き伝統に従って、最後の要素は範囲に含まれないことに注意してください。

例:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};

Arrays.sort(x, 4, 8);
String str = Arrays.toString(x);


変数strには次の値が含まれます。
"[11, -2, 3, 0, -20, -20, 8, 999, 99, -20]"

配列をソートするために、Java は最速のソート アルゴリズムであるQuickSortを使用します。計算の複雑さは配列のサイズに依存し、式 N log(N) を使用して計算されます。

1,000 個の要素からなる配列を並べ替えるには、配列要素の約 3,000 回の比較が必要になります。100 万要素の配列を並べ替えるには、約 600 万回の比較が必要になります。



5.Arrays.binarySearch()

このクラスの最も興味深い最後のメソッドは、Arrays配列内の指定された値を検索できます。これは普通の検索ではなく、人気の二分検索です。要約すると次のとおりです。

  • まず、配列がソートされます。
  • 次に、配列の中央の要素が、探している要素と比較されます。
  • 要素が中央の要素より大きい場合、配列の右半分で検索が続行されます。
  • 探している要素が中央の要素より小さい場合、配列の左半分で検索が続行されます。

配列はソートされているため、1 回の比較で配列の半分を削除できます。次のステップでは、さらに半分を捨てます。

このアプローチにより、二分探索が非常に高速になります。100 万 (!) 個の要素からなる配列では、わずか 20 回の比較で目的の要素のインデックスを見つけることができます。このアプローチの欠点は、最初に配列をソートする必要があり、ソートにも時間がかかることです。

これを呼び出すと次のようになります。

int index = Arrays.binarySearch(name, value);

ここでname、 は配列の名前です。これは、(たとえば、 メソッドを使用してArrays.sort()) ソート済みで渡す必要があります。そしてvalue、配列内で検索している要素です。メソッドによって返される結果は、目的の配列要素のインデックスです。

例:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};
Arrays.sort(x);

int index1 = Arrays.binarySearch(x, 0);
int index2 = Arrays.binarySearch(x, -20);
int index3 = Arrays.binarySearch(x, 99);
int index4 = Arrays.binarySearch(x, 5);
xは:
{-20, -20, -20, -2, 0, 3, 8, 11, 99, 999}

4
1(インデックス02でも可)
8
-7

配列に検索対象の要素の複数のインスタンスが含まれている場合、アルゴリズムは単にそのうちの 1 つのインデックスを返します (たとえば、それが最初のものであるか、その逆であるかは保証されません。つまり、それらの最後のものであるという保証はありません) 要素が重複しています)。

要素が配列内に見つからない場合、インデックスは負の値になります。



6.Arraysクラスに関する Oracle ドキュメントへのリンク

Arrays非常に興味がある場合は、公式ドキュメントのクラスとそのすべてのメソッドに関するすべてを読むことができます。 a href="https://docs.oracle.com/en/java/javase/14/docs/api/java.base /java/util/Arrays.html">Oracle Web サイト。

たとえば、Arrays.mismatch()Arrays.compare()メソッドについて読むことができます。もしかしたら、何らかの形で役に立つかもしれません。

メソッドの数に混乱しないでください。各メソッドには 5 ~ 10 のバリアントがあり、パラメータのタイプのみが異なります。