Liệt kê vấn đề chuyển đổi <Chuỗi> sang ArrayList <Chuỗi>


91

Tôi có một phương pháp sau đây ... thực sự lấy danh sách các câu và chia từng câu thành các từ. Nó đây rồi:

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;
}

Tôi phải chuyển danh sách này vào một bản đồ băm ở định dạng sau

HashMap<String, ArrayList<String>>

vì vậy phương thức này trả về Danh sách và tôi cần một Danh sách mảng? Nếu tôi cố gắng truyền nó không thành công ... bất kỳ đề xuất nào?

Ngoài ra, nếu tôi thay đổi ArrayList thành List trong HashMap, tôi nhận được

java.lang.UnsupportedOperationException

vì dòng này trong mã của tôi

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

Bất kỳ đề xuất tốt hơn?

Câu trả lời:


53

Trước hết, tại sao bản đồ là a HashMap<String, ArrayList<String>>mà không phải là a HashMap<String, List<String>>? Có một số lý do tại sao giá trị phải là một triển khai cụ thể của giao diện List( ArrayListtrong trường hợp này)?

Arrays.asListkhông trả về a java.util.ArrayList, vì vậy bạn không thể gán giá trị trả về của Arrays.asListmột biến kiểu ArrayList.

Thay vì:

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

Thử đi:

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

3
Và cụ thể UnsupportedOperationExceptionlà do Arrays.asListphương thức trả về một danh sách có kích thước cố định được hỗ trợ bởi một mảng - nó không thể sửa đổi được. Giải pháp được trình bày ở đây bởi @Jesper sẽ tránh được điều đó.
Duncan Jones,

191

Truyền hoạt động trong trường hợp thực tế của danh sách là một ArrayList. Nếu đúng như vậy, giả sử a Vector(là một phần mở rộng khác của List) nó sẽ ném ra một ClassCastException.

Lỗi khi thay đổi định nghĩa HashMap của bạn là do các phần tử được xử lý sau đó và quá trình đó mong đợi một phương thức chỉ được xác định trong ArrayList. Ngoại lệ cho bạn biết rằng nó không tìm thấy phương pháp mà nó đang tìm kiếm.

Tạo một cái mới ArrayListvới nội dung của cái cũ.

new ArrayList<String>(myList);

41

Hãy xem ArrayList # addAll (Bộ sưu tập)

Nối tất cả các phần tử trong tập hợp đã chỉ định vào cuối danh sách này, theo thứ tự chúng được trả về bởi Iterator của tập hợp đã chỉ định. Hành vi của hoạt động này là không xác định nếu bộ sưu tập được chỉ định được sửa đổi trong khi hoạt động đang diễn ra. (Điều này ngụ ý rằng hành vi của lệnh gọi này là không xác định nếu bộ sưu tập được chỉ định là danh sách này và danh sách này là không có gì cả.)

Vì vậy, về cơ bản bạn có thể sử dụng

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

13

Trong Kotlin List có thể được chuyển đổi thành ArrayList thông qua việc chuyển nó như một tham số khởi tạo.

ArrayList(list)

5

Arrays.asListkhông trả về thể hiện của java.util.ArrayListnhưng nó trả về thể hiện của java.util.Arrays.ArrayList.

Bạn sẽ cần chuyển đổi sang ArrayList nếu bạn muốn truy cập ArrayListthông tin cụ thể

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

0

Phương pháp tiếp cận đã thử nghiệm và thử nghiệm.

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

    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.