JavaRush /Java Blog /Random-KO /Java 목록을 배열로: 요소 목록을 배열로 변환
Анзор Кармов
레벨 31
Санкт-Петербург

Java 목록을 배열로: 요소 목록을 배열로 변환

Random-KO 그룹에 게시되었습니다
안녕하세요! 이 기사에서는 Java에서 요소 목록을 요소 배열로 변환하는 방법을 살펴보겠습니다. 사실, 이를 수행하는 방법은 그리 많지 않으며 모두 간단하므로 기사가 복잡하지 않을 것입니다. Java 목록을 배열로: 요소 목록을 배열로 변환 - 1우리가 무엇을 할 것인지 즉시 결정합시다. 목록을 배열로 변환하고, 보다 구체적으로 문자열 목록을 변환합니다. I, love, learning, on, JavaRush는 동일한 문자열의 배열로 변환됩니다. 하지만 먼저 약간의 보너스가 있습니다. 목록을 빠르게 작성하는 방법에 대해 이야기합시다.

목록을 배열에 빠르게 기록하는 방법

기억하세요: 이 삶에는 두 가지 시나리오가 있습니다. 첫 번째는 새 목록을 초기화할 때의 완전히 우울하고 지루함입니다.
List<String> wordsList = new ArrayList();
그리고 거기에 값을 추가합니다... 하나씩...
wordsList.add("I");
wordsList.add("love");
wordsList.add("learning");
wordsList.add("on");
wordsList.add("JavaRush");
좋지 않다. 목록을 만드는 동안 목록이 왜 필요한지 잊어버렸습니다! 두 번째 방법은 불필요한 것들을 모두 잘라내고 유틸리티 클래스를 채택하는 것입니다. Arrays예를 들어, 믿을 수 없을 만큼 편리한 메소드를 가진 클래스가 있습니다 asList. 목록을 만들고 싶은 것은 무엇이든 전달할 수 있으며, 메서드는 이를 목록으로 만듭니다. 이 같은:
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
varargs이 방법은 그 자체 로 배열을 사용합니다 . List to Array라는 강의에서 배열부터 List를 먼저 가르쳐 주셨는데, 상황상 그렇게 해야 했던 점 사과드립니다. 이제 목록을 배열로 변환하는 방법을 살펴보겠습니다.

방법 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두 가지 메서드가 있습니다 .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[]). 그러나 이 방법은 인수를 허용하지 않으므로 일부 상황에서는 편리할 수 있습니다. 두 번째 메서드도 현재 목록의 모든 요소(첫 번째부터 마지막까지)를 포함하는 배열을 반환합니다. 그러나 첫 번째 방법과 달리 두 번째 방법은 특정 유형의 배열을 인수로 사용합니다. 그러나 두 번째 메소드의 결과는 객체 배열이 아니라 특정 데이터 유형의 배열입니다. 이는 인수로 전달된 배열 메소드의 데이터 유형과 동일합니다.
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. 메서드의 논리는 전송된 배열의 길이에 따라 달라집니다. 세 가지 가능한 시나리오가 있습니다.

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
세 가지 방법 중 어떤 방법을 선택해야 할까요? 초기 버전의 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를 사용하면 각 값을 변환할 수 있을 뿐만 아니라 필터링할 수도 있습니다. 문자열 목록에서 배열을 수집하려고 하지만 두 문자보다 긴 문자열만 배열에 포함된다고 가정해 보겠습니다.
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() > 2true이면 해당 행은 결과 선택 항목에 포함되고 최종적으로는 배열에 포함됩니다. 그렇지 않으면 맞지 않습니다. 여기서는 단순히 요소를 반복하고 다양한 제한을 적용함으로써 동일한 결과를 얻을 수 있다고 말할 가치가 있습니다. 이 방법으로도 할 수 있습니다. Stream API는 이러한 문제를 해결하기 위해 보다 기능적인 접근 방식을 제공합니다.

결과

이 기사에서는 목록을 배열로 변환하는 다양한 방법을 살펴보았습니다.
  • 단순 검색;
  • 방법toArray;
  • 스트림 API.
toArray가장 좋은 방법은 인터페이스에 정의된 메서드를 사용하는 것입니다 List. 다음과 같은 두 가지 방법이 있습니다.
  • Object[] toArray();
  • T[] toArray(T[] a);
첫 번째는 인수를 허용하지 않지만 객체 배열을 반환하므로 명시적인 유형 캐스팅에 의존해야 하는 경우가 가장 많습니다. 두 번째는 원하는 유형의 배열을 반환하지만 배열을 인수로 사용합니다. 빈 배열을 메서드에 전달하는 것이 가장 좋으며, 그러면 만족할 것입니다. Stream API를 사용하면 목록을 배열로 변환할 수 있을 뿐만 아니라 요소를 배열에 추가하기 전에 요소를 필터링하거나 변환하는 등 일부 작업을 수행할 수도 있습니다.

숙제

이 문서의 모든 예제를 직접 반복해 보세요. 단, 원래 문자열 목록 대신 0에서 10까지의 정수 목록을 사용하세요. 당연히 문자열에만 적용되는 예제의 일부 조건을 새 목록에 적용해야 합니다. 정황.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION