Buat daftar masalah konversi <String> ke ArrayList <String>


91

Saya memiliki metode berikut ... yang sebenarnya mengambil daftar kalimat dan membagi setiap kalimat menjadi kata-kata. Ini dia:

public List<String> getWords(List<String> strSentences){
allWords = new ArrayList<String>();
    Iterator<String> itrTemp = strSentences.iterator();
    while(itrTemp.hasNext()){
        String strTemp = itrTemp.next();
        allWords = Arrays.asList(strTemp.toLowerCase().split("\\s+"));          
    }
    return allWords;
}

Saya harus meneruskan daftar ini ke dalam hashmap dalam format berikut

HashMap<String, ArrayList<String>>

jadi metode ini mengembalikan List dan saya membutuhkan arrayList? Jika saya mencoba untuk melemparkannya tidak berhasil ... ada saran?

Juga, jika saya mengubah ArrayList ke List di HashMap, saya mengerti

java.lang.UnsupportedOperationException

karena baris ini di kode saya

sentenceList.add(((Element)sentenceNodeList.item(sentenceIndex)).getTextContent());

Ada saran yang lebih baik?

Jawaban:


53

Pertama-tama, mengapa peta itu a HashMap<String, ArrayList<String>>dan bukan a HashMap<String, List<String>>? Adakah alasan mengapa nilai harus berupa implementasi antarmuka tertentu List( ArrayListdalam kasus ini)?

Arrays.asListtidak mengembalikan a java.util.ArrayList, jadi Anda tidak dapat menetapkan nilai kembalian Arrays.asListke variabel tipe ArrayList.

Dari pada:

allWords = Arrays.asList(strTemp.toLowerCase().split("\\s+"));

Coba ini:

allWords.addAll(Arrays.asList(strTemp.toLowerCase().split("\\s+")));

3
Dan secara khusus UnsupportedOperationExceptionpenyebabnya karena Arrays.asListmetode mengembalikan daftar berukuran tetap yang didukung oleh larik - tidak dapat diubah. Solusi yang disajikan di sini oleh @Jesper akan menghindarinya.
Duncan Jones

191

Transmisi berfungsi di mana contoh sebenarnya dari daftar adalah ArrayList. Jika ya, katakanlah, a Vector(yang merupakan ekstensi lain dari List) itu akan memunculkan ClassCastException.

Kesalahan saat mengubah definisi HashMap Anda disebabkan oleh elemen yang kemudian diproses, dan proses itu mengharapkan metode yang hanya ditentukan di ArrayList. Pengecualian memberi tahu Anda bahwa ia tidak menemukan metode yang dicari.

Buat yang baru ArrayListdengan konten yang lama.

new ArrayList<String>(myList);

42

Lihatlah ArrayList # addAll (Collection)

Menambahkan semua elemen dalam koleksi yang ditentukan ke akhir daftar ini, dalam urutan yang dikembalikan oleh Iterator koleksi yang ditentukan. Perilaku operasi ini tidak ditentukan jika koleksi yang ditentukan diubah saat operasi sedang berlangsung. (Ini menyiratkan bahwa perilaku panggilan ini tidak ditentukan jika koleksi yang ditentukan adalah daftar ini, dan daftar ini tidak kosong.)

Jadi pada dasarnya Anda bisa menggunakan

ArrayList<String> listOfStrings = new ArrayList<>(list.size());
listOfStrings.addAll(list);

14

Dalam Kotlin List dapat diubah menjadi ArrayList dengan meneruskannya sebagai parameter konstruktor.

ArrayList(list)

5

Arrays.asListtidak mengembalikan contoh java.util.ArrayListtetapi mengembalikan contoh java.util.Arrays.ArrayList.

Anda harus mengubah ke ArrayList jika Anda ingin mengakses ArrayListinformasi tertentu

allWords.addAll(Arrays.asList(strTemp.toLowerCase().split("\\s+")));

0

Pendekatan yang telah dicoba dan diuji.

public static ArrayList<String> listToArrayList(List<Object> myList) {
        ArrayList<String> arl = new ArrayList<String>();
        for (Object object : myList) {
            arl.add((String) object);
        }
        return arl;

    }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.