JavaRush /Blog Java /Random-PL /Lista Java na tablicę: przekonwertuj listę elementów na t...
Анзор Кармов
Poziom 31
Санкт-Петербург

Lista Java na tablicę: przekonwertuj listę elementów na tablicę

Opublikowano w grupie Random-PL
Cześć! W tym artykule przyjrzymy się, jak przekonwertować listę elementów na tablicę elementów w Javie. W rzeczywistości nie ma na to zbyt wielu sposobów i wszystkie są proste, więc artykuł nie będzie skomplikowany. Lista Java na tablicę: przekonwertuj listę elementów na tablicę - 1Od razu zdecydujmy, z czym pracujemy. Listy zamienimy na tablice, a dokładniej listę ciągów znaków: I, love, learning, on, JavaRush zostanie przekonwertowany na tablicę tych samych ciągów. Ale najpierw mały bonus. Porozmawiajmy o tym, jak szybko zapisać listę.

Jak szybko zapisać listę do tablicy

Pamiętaj: w tym życiu są dwa scenariusze. Pierwszą z nich jest całkowita melancholia i nuda, gdy inicjujemy nową listę:
List<String> wordsList = new ArrayList();
A potem dodajemy do tego wartości... Jedna po drugiej...
wordsList.add("I");
wordsList.add("love");
wordsList.add("learning");
wordsList.add("on");
wordsList.add("JavaRush");
Nie dobrze. Podczas tworzenia zapomniałem, do czego ta lista była potrzebna! Drugi sposób to odcięcie wszystkich zbędnych rzeczy i przyjęcie... klas użytkowych. Na przykład klasa Arrays, która posiada niesamowicie wygodną metodę asList. Możesz przekazać do niego wszystko, co chcesz, aby utworzyć listę, a metoda sprawi, że będzie to lista. Coś takiego:
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
Metoda ta uwzględnia w sobie varargs- w pewnym sensie tablicę. Przepraszam, że w wykładzie o nazwie lista na tablicę uczyłem cię, że tablica ma być wyświetlana w pierwszej kolejności, ale wymagały tego okoliczności. Cóż, teraz o naszych metodach konwertowania list na tablice.

Metoda nr 1. Biust

Ta metoda jest idealna dla tych, którzy lubią wpisywać kod na klawiaturze bez większego zastanowienia. Rodzaj medytacji. Krok 1. Utwórz tablicę o tej samej długości co lista:
List<String> wordsList = Arrays.asList("I", "love", "learning", "on", "JavaRush");
String[] wordsArray = new String[wordsList.size()];
Krok 2. Utwórz pętlę z licznikiem, aby iterować po wszystkich elementach listy i mieć dostęp do komórek tablicy według indeksu:
for (int i = 0; i < wordsList.size(); i++) {

}
Krok 3. Wewnątrz pętli przypisujemy wartość każdego elementu listy o indeksie i do komórki tablicy o indeksie i:
for (int i = 0; i < wordsList.size(); i++) {
    wordsArray[i] = wordsList.get(i);
}
Wynik:
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);
        }
    }

Metoda nr 2. Metoda toArray

Prawdopodobnie najbardziej optymalna rzecz do użycia. Interfejs Listma dwie metody toArray, które tworzą tablicę z bieżącej listy:
Object[] toArray();
 T[] toArray(T[] a);
Pierwsza metoda zwraca tablicę obiektów zawierającą wszystkie elementy aktualnej listy (od pierwszego do ostatniego):
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);
        }

    }
}
Uruchommy metodę maini zobaczmy, co następuje:

I
love
learning
on
JavaRush
Metoda ta ma jednak swoją specyfikę: zawsze zwraca tablicę obiektów (Object[]). Dlatego zwrócony wynik musi zostać rzutowany na żądany typ danych. W powyższym przykładzie rzutujemy go na tablicę ciągów znaków (String[]). Jednak ta metoda nie akceptuje argumentów, co może być wygodne w niektórych sytuacjach. Druga metoda zwraca również tablicę zawierającą wszystkie elementy bieżącej listy (od pierwszego do ostatniego). Jednak w przeciwieństwie do pierwszej, druga metoda przyjmuje jako argument tablicę określonego typu. Jednak wynikiem drugiej metody nie będzie tablica obiektów, ale tablica określonego typu danych - takiego samego, jak typ danych w metodzie tablicowej przekazywanej jako argumenty.
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);
        }

    }
}
Jeśli uruchomimy metodę main, na wyjściu zobaczymy te same słowa:

I
love
learning
on
JavaRush
Porozmawiajmy trochę o tablicy przekazywanej jako argument do metody toArray. Logika metody zależy od długości przesyłanej tablicy. Istnieją trzy możliwe scenariusze:

1. Długość przesyłanej tablicy jest mniejsza niż długość listy

W tym przypadku metoda tworzy nową tablicę i umieszcza w niej elementy listy. Pokazaliśmy to na powyższym przykładzie.

2. Długość przekazywanego elementu jest równa długości listy

Metoda umieści elementy listy w przekazanej tablicy. Zademonstrujmy to:
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);
        }

    }
}
Podczas wyprowadzania zobaczymy wszystkie te same linie i stanie się jasne, że metoda wypełniła utworzoną przez nas tablicę.

3. Długość przesyłanej tablicy jest większa niż długość listy

Metoda zapisze wszystkie elementy listy w tablicy i zapisze wartość w komórce obok ostatnio dodanego elementu null. Zademonstrujmy to:
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);
        }

    }
}
Po uruchomieniu metody mainw konsoli zobaczymy:

I
love
learning
on
JavaRush
null
6
7
8
9
Którą metodę z trzech wybrać? We wczesnych wersjach Javy optymalnym rozwiązaniem było przekazywanie tablicy o długości równej lub większej niż długość listy. Jednak nowoczesne maszyny JVM mają optymalizacje i w niektórych przypadkach zapewniają większą wydajność w przypadku metody, do której przekazywana jest tablica o długości krótszej niż długość listy. Jeśli więc używasz nowoczesnej wersji Java, przekaż pustą tablicę do metody, tak jak to zrobiliśmy w pierwszym przykładzie:
wordsList.toArray(new String[0]);

Metoda numer 3. Strumieniowe API

Ta metoda jest odpowiednia dla tych, którzy chcą nie tylko przekonwertować listę na tablicę, ale także rozwiązać kilka innych problemów. A także dla osób zaznajomionych z Java Stream API. JavaRush ma dobry artykuł na ten temat . W tej sekcji przyjrzymy się kilku przykładom wykorzystania strumieni. Jak przekonwertować listę na tablicę za pomocą strumieni:
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

         */
    }
}
Jeśli jednak potrzebujesz po prostu rzucić listę na tablicę, lepiej to zrobić, korzystając z metody toArrayopisanej w metodzie nr 2. Jeśli jednak chcesz nie tylko przekonwertować listę na tablicę, ale także wykonać jakąś akcję na każdym elemencie, to jest to właściwe miejsce dla Ciebie. Spróbujmy przekonwertować listę na tablicę tak, aby w końcowej tablicy wszystkie wiersze były zapisane wielkimi literami:
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

         */
    }
}
Tutaj .map(str -> str.toUpperCase())zdefiniowaliśmy, co należy zrobić z każdą linią na liście. W tym przypadku zdecydowaliśmy się zamienić każdy ciąg znaków na wielkie litery, a następnie zebrać je w tablicę. Korzystanie z Stream API pozwala nie tylko przekształcać każdą wartość, ale także ją filtrować. Załóżmy, że chcemy pobrać tablicę z listy ciągów, ale w taki sposób, aby w tablicy znalazły się tylko ciągi dłuższe niż dwa znaki:
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
         */
    }
}
Tutaj w wierszu .filter(str -> str.length() > 2)stworzyliśmy tzw. filtr, który zostanie zastosowany do każdego elementu listy, zanim trafi on do tablicy. W tym przypadku metoda jest wywoływana dla każdego wiersza length()i jeśli wynik wyrażenia str.length() > 2jest prawdziwy, taki wiersz znajdzie się w wynikowej selekcji, a ostatecznie w tablicy. Inaczej nie trafi. Być może w tym miejscu warto powiedzieć, że to samo można osiągnąć po prostu iterując po elementach i nakładając różne ograniczenia. Można to zrobić także w ten sposób. Stream API zapewnia bardziej funkcjonalne podejście do rozwiązywania takich problemów.

Wyniki

W tym artykule przyjrzeliśmy się różnym sposobom konwertowania list na tablice:
  • proste wyszukiwanie;
  • metodatoArray;
  • Strumieniowe API.
Najlepszą opcją jest użycie metody toArrayzdefiniowanej w interfejsie List. Istnieją dwie takie metody:
  • Object[] toArray();
  • T[] toArray(T[] a);
Pierwsza nie akceptuje argumentów, ale zwraca tablicę obiektów, dlatego najczęściej będziesz musiał uciekać się do jawnego rzutowania typów. Druga zwraca tablicę żądanego typu, ale przyjmuje tablicę jako argument. Najlepiej przekazać do metody pustą tablicę i będziesz zadowolony. Korzystanie z Stream API pozwala nie tylko przekonwertować listę na tablicę, ale także wykonać po drodze pewne działania, takie jak filtrowanie lub konwertowanie elementów przed dodaniem ich do tablicy.

Praca domowa

Spróbuj sam powtórzyć wszystkie przykłady z tego artykułu, ale zamiast oryginalnej listy ciągów użyj listy liczb całkowitych od 0 do 10. Naturalnie będziesz musiał dostosować do nowych warunków z przykładów, które dotyczą tylko ciągów znaków warunki.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION