JavaRush /Java Blog /Random-TW /Java列表轉數組:將元素列表轉換為數組
Анзор Кармов
等級 31
Санкт-Петербург

Java列表轉數組:將元素列表轉換為數組

在 Random-TW 群組發布
你好!在本文中,我們將了解如何在 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從某種意義上說, 該方法本身就是一個陣列。我很抱歉,在名為“列表到數組”的講座中,我首先教了您從數組到列表,但情況需要它。好吧,現在介紹我們將列表轉換為數組的方法。

方法號 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。串流媒體介面

此方法適合那些不僅想要將清單轉換為數組,而且還想解決一些其他問題的人。也適合熟悉 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() > 2為 true,則這樣的行將最終出現在結果選擇中,並最終出現在陣列中。不然打不著。在這裡,也許值得一提的是,透過簡單地迭代元素並施加各種限制就可以實現相同的效果。你也可以這樣做。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