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. Od 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. InterfejsList
ma 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ę main
i 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 elementunull
. 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 main
w 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 toArray
opisanej 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() > 2
jest 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;
- metoda
toArray;
- Strumieniowe API.
toArray
zdefiniowanej w interfejsie List
. Istnieją dwie takie metody:
Object[] toArray();
T[] toArray(T[] a);
GO TO FULL VERSION