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?

Skipper07
sumber

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+")));
Jesper
sumber
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);
SJuan76
sumber
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);
MadProgrammer
sumber
14

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

ArrayList(list)
Shahab Rauf
sumber
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+")));
Amit Deshpande
sumber
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;

    }
S Krishna
sumber