2012-10-30 45 views
44

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ách từng câu thành các từ. Dưới đây là nó:Danh sách <String> cho ArrayList <String> vấn đề chuyển đổ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 vượt qua danh sách này vào một hashmap trong một định dạng sau

HashMap<String, ArrayList<String>> 

vì vậy phương pháp này trả về Danh sách và tôi cần một ArrayList? Nếu tôi cố gắng cast nó không tập luyện ... bất cứ đề nghị?

Ngoài ra, nếu tôi thay đổi ArrayList vào danh sách trong một 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ỳ gợi ý tốt hơn?

Trả lời

33

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

Arrays.asList không trả về số java.util.ArrayList, vì vậy bạn không thể chỉ định giá trị trả lại là Arrays.asList thành biến số ArrayList.

Thay vì:

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

Hãy thử điều này:

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

Và đặc biệt là 'UnsupportedOperationException' được gây ra bởi vì các' phương pháp Arrays.asList' 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ể được sửa đổi. Giải pháp được trình bày ở đây bởi @Jesper sẽ tránh được điều đó. –

+0

cảm ơn ... nó được giải quyết – Skipper07

4

Arrays.asList không trả lại bản sao của java.util.ArrayList nhưng nó trả về phiên bản java.util.Arrays.ArrayList.

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

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

Cast hoạt động nơi các ví dụ thực tế của danh sách là một ArrayList. Nếu đó là, giả sử, một số 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 của HashMap của bạn là do các yếu tố sau này được xử lý và quá trình đó hy vọng một phương thức được xác định chỉ trong ArrayList. Ngoại lệ cho bạn biết rằng nó không tìm thấy phương thức mà nó đang tìm kiếm.

Tạo mới ArrayList với nội dung cũ.

new ArrayList<String>(myList); 
+1

Cá nhân cảm thấy đây là câu trả lời có thể đọc được hầu hết các – SARose

20

Hãy xem ArrayList#addAll(Collection)

Gắn tất cả các yếu tố trong bộ sưu tập theo quy định đến hết danh sách này, theo thứ tự mà chúng được trả về bởi Iterator các quy định bộ sưu tập của. Hành vi của hoạt động này không xác định nếu bộ sưu tập được chỉ định được sửa đổi trong khi thao tác đang trong tiến trình . (Điều này ngụ ý rằng hành vi của cuộc gọi này là undefined nếu bộ sưu tập được chỉ định danh sách này, và danh sách này là không rỗng.)

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

ArrayList<String> listOfStrings = new ArrayList<>(list.size()); 
listOfStrings.addAll(list); 
Các vấn đề liên quan