こんにちは!この記事では、Java で要素のリストを要素の配列に変換する方法を見ていきます。実際、これを行う方法はそれほど多くはなく、どれも簡単なので、記事は複雑ではありません。 すぐに何を扱うかを決めましょう。リストを配列に変換します。具体的には、文字列のリスト「I、love、learning、on、JavaRush」は、同じ文字列の配列に変換されます。でもその前に、ちょっとしたボーナスを。リストを素早く書き留める方法について話しましょう。
リストを配列に素早く書き込む方法
覚えておいてください。この人生には 2 つのシナリオがあります。1 つ目は、新しいリストを初期化するときの完全な憂鬱と退屈です。
List<String> wordsList = new ArrayList();
そして、それに値を追加していきます... 1 つずつ...
wordsList.add("I");
wordsList.add("love");
wordsList.add("learning");
wordsList.add("on");
wordsList.add("JavaRush");
ダメだ。作成中にリストが必要な理由を忘れてしまいました。2 番目の方法は、不要なものをすべて削除し、ユーティリティ クラスを採用することです。たとえば、クラス にArrays
は非常に便利なメソッドがありますasList
。リストを作成したいものは何でも渡すことができ、メソッドによってリストが作成されます。このようなもの:
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
varargs
このメソッドは、それ自体を、ある意味、配列 に取り込みます。リストから配列へという講義で、最初に配列からリストへということを教えたのですが、事情によりそうする必要があったことをお詫び申し上げます。さて、リストを配列に変換する方法に移ります。
方法その1。バスト
この方法は、何も考えずにキーボードでコードを入力したい人に最適です。一種の瞑想。ステップ 1. リストと同じ長さの配列を作成します。
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] wordsArray = new String[wordsList.size()];
ステップ 2. カウンタを含むループを作成して、リストのすべての要素を反復処理し、インデックスによって配列セルにアクセスできるようにします。
for (int i = 0; i < wordsList.size(); i++) {
}
ステップ 3. ループ内で、インデックス i の各リスト要素の値をインデックス i の配列セルに割り当てます。
for (int i = 0; i < wordsList.size(); i++) {
wordsArray[i] = wordsList.get(i);
}
結果:
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] wordsArray = new String[wordsList.size()];
for (int i = 0; i < wordsList.size(); i++) {
wordsArray[i] = wordsList.get(i);
}
}
方法その2。toArray メソッド
おそらく最も最適に使用できるものです。このインターフェイスには、現在のリストから配列を作成するList
2 つのメソッドがあります。toArray
Object[] toArray();
T[] toArray(T[] a);
最初のメソッドは、現在のリストのすべての要素 (最初から最後まで) を含むオブジェクトの配列を返します。
public class Main {
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] wordsArray = (String[]) wordsList.toArray();
for (String word : wordsArray) {
System.out.println(word);
}
}
}
メソッドを実行してmain
、次のことを確認してみましょう。
I
love
learning
on
JavaRush
ただし、このメソッドには特殊な点があり、常にオブジェクトの配列を返します(Object[])
。したがって、返された結果は目的のデータ型にキャストする必要があります。上の例では、それを文字列の配列にキャストしています(String[])
。ただし、このメソッドは引数を受け入れないため、状況によっては便利です。2 番目のメソッドは、現在のリストのすべての要素 (最初から最後まで) を含む配列も返します。ただし、最初のメソッドとは異なり、2 番目のメソッドは引数として特定の型の配列を受け取ります。ただし、2 番目のメソッドの結果はオブジェクトの配列ではなく、特定のデータ型の配列になります。これは、引数として渡された配列メソッドのデータ型と同じです。
public class Main {
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] wordsArray = wordsList.toArray(new String[0]);
for (String word : wordsArray) {
System.out.println(word);
}
}
}
メソッドを実行するとmain
、出力に同じ単語が表示されます。
I
love
learning
on
JavaRush
に引数として渡される配列について少し話しましょうtoArray
。このメソッドのロジックは、送信される配列の長さに応じて異なります。考えられるシナリオは次の 3 つです。
1. 送信された配列の長さがリストの長さより短い
この場合、メソッドは新しい配列を作成し、そこにリスト要素を配置します。上の例でこれを実証しました。2. 渡される要素の長さはリストの長さに等しい
このメソッドは、渡された配列にリスト要素を配置します。これを実証してみましょう:
public class Main {
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
// Создаем пустой массив нужной длины
String[] array = new String[wordsList.size()];
// Отправляем пустой массив в метод toArray
wordsList.toArray(array);
// Проверяем, заполнился ли наш массив. Спойлер: да
for (String word : array) {
System.out.println(word);
}
}
}
出力すると、すべて同じ行が表示され、作成した配列がメソッドによって埋められたことが明らかになります。
3. 送信された配列の長さがリストの長さよりも長い
このメソッドは、リストのすべての要素を配列に書き込み、最後に追加された要素の隣のセルに値を書き込みますnull
。これを実証してみましょう:
public class Main {
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
// Создаем пустой массив, длина которого в 2 раза больше длины списка
String[] array = new String[wordsList.size() * 2];
for (int i = 0; i < array.length; i++) {
// В каждую ячейку запишем строковое представление текущего индекса
array[i] = String.valueOf(i);
}
// Отправляем массив в метод toArray
wordsList.toArray(array);
// Проверяем, что лежит в нашем массиве
for (String word : array) {
System.out.println(word);
}
}
}
main
コンソールで メソッドを実行すると、次のように表示されます。
I
love
learning
on
JavaRush
null
6
7
8
9
3 つの方法のうちどれを選択する必要がありますか? Java の初期のバージョンでは、リストの長さ以上の長さの配列を渡すことが最適でした。ただし、最新の JVM には最適化が施されており、場合によっては、リストの長さよりも短い配列が渡されるメソッドのパフォーマンスが向上します。したがって、最新バージョンの Java を実行している場合は、最初の例で行ったように、空の配列をメソッドに渡します。
wordsList.toArray(new String[0]);
方法その3。ストリームAPI
この方法は、リストを配列に変換するだけでなく、途中で他のいくつかの問題も解決したい人に適しています。また、Java Stream API に精通している人も対象です。JavaRush には、このトピックに関する優れた記事があります。このセクションでは、ストリームを使用したいくつかの例を見ていきます。ストリームを使用してリストを配列に変換する方法:
public class Main {
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] strings = wordsList.stream()
.toArray(String[]::new);
for (String s : strings) {
System.out.println(s);
}
/*
Output:
I
love
learning
on
JavaRush
*/
}
}
ただし、リストを配列にキャストする必要があるだけの場合は、toArray
方法 2 で説明されている方法を使用してこれを行うことをお勧めします。ただし、リストを配列に変換するだけでなく、各要素に対して何らかのアクションを実行したい場合は、ここが最適な場所です。最終的な配列ではすべての行が大文字で書かれるように、リストを配列に変換してみます。
public class Main {
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] strings = wordsList.stream()
.map(str -> str.toUpperCase())
.toArray(String[]::new);
for (String s : strings) {
System.out.println(s);
}
/*
Output:
I
LOVE
LEARNING
ON
JAVARUSH
*/
}
}
ここでは、.map(str -> str.toUpperCase())
リストの各行で何を行う必要があるかを定義しました。この場合、各文字列を大文字に変換してから配列に収集することにしました。Stream API を使用すると、各値を変換するだけでなく、フィルターすることもできます。文字列のリストから配列を収集したいが、2 文字より長い文字列のみが配列に含まれるようにしたいとします。
public class Main {
public static void main(String[] args) {
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] strings = wordsList.stream()
.filter(str -> str.length() > 2)
.map(str -> str.toUpperCase())
.toArray(String[]::new);
for (String s : strings) {
System.out.println(s);
}
/*
Output:
LOVE
LEARNING
JAVARUSH
*/
}
}
この行では、.filter(str -> str.length() > 2)
配列に入る前にリストの各要素に適用されるいわゆるフィルターを作成しています。この場合、メソッドは行ごとに呼び出されlength()
、式の結果がstr.length() > 2
true の場合、その行は結果として得られる選択、そして最終的に配列に含まれます。そうしないとヒットしません。ここで、おそらく、要素を反復し、さまざまな制限を課すだけで同じことが達成できると言うのは価値があります。この方法でもできます。Stream API は、このような問題を解決するためのより機能的なアプローチを提供します。
結果
この記事では、リストを配列に変換するさまざまな方法を検討しました。- 簡単な検索。
- 方法
toArray;
- ストリームAPI。
toArray
最良のオプションは、インターフェイスで定義されているメソッドを使用することですList
。このような方法には次の 2 つがあります。
Object[] toArray();
T[] toArray(T[] a);
GO TO FULL VERSION