Перелічити проблему перетворення <String> у ArrayList <String>


91

У мене є наступний метод ... який фактично бере список речень і розбиває кожне речення на слова. Ось воно:

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

Я повинен передати цей список у хеш-карту у наступному форматі

HashMap<String, ArrayList<String>>

отже, цей метод повертає List, і мені потрібен arrayList? Якщо я спробую кинути, це не тренується ... будь-які пропозиції?

Крім того, якщо я змінив ArrayList на List у HashMap, я отримую

java.lang.UnsupportedOperationException

через цей рядок у моєму коді

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

Будь-які кращі пропозиції?

Відповіді:


53

Перш за все, чому карта a, HashMap<String, ArrayList<String>>а не a HashMap<String, List<String>>? Чи є якась причина, чому значенням має бути конкретна реалізація інтерфейсу List( ArrayListв даному випадку)?

Arrays.asListне повертає a java.util.ArrayList, тому ви не можете призначити значення Arrays.asListзмінної типу змінній типу ArrayList.

Замість:

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

Спробуйте це:

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

3
І саме UnsupportedOperationExceptionце спричинено тим, що Arrays.asListметод повертає список фіксованого розміру, підкріплений масивом - його неможливо змінити. Рішення, представлене тут @Jesper, цього уникне.
Duncan Jones

191

Робота працює там, де фактичним екземпляром списку є файл ArrayList. Якщо це, скажімо, a Vector(що є ще одним розширенням List), він викличе ClassCastException.

Помилка при зміні визначення вашого HashMap відбувається з - за елементи, що обробляються пізніше, і цей процес очікує , що метод , який визначений тільки в ArrayList. Виняток повідомляє вам, що він не знайшов шуканий метод.

Створіть новий ArrayListіз вмістом старого.

new ArrayList<String>(myList);

41

Погляньте на ArrayList # addAll (Колекція)

Додає всі елементи зазначеної колекції до кінця цього списку в порядку, коли їх повертає ітератор зазначеної колекції. Поведінка цієї операції невизначена, якщо зазначена колекція модифікується під час виконання операції. (Це означає, що поведінка цього виклику невизначена, якщо вказана колекція є цим списком, а цей список не пустий.)

Отже, в основному ви могли б використовувати

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

12

У Kotlin List можна перетворити в ArrayList, передавши його як параметр конструктора.

ArrayList(list)

5

Arrays.asListне повертає екземпляр, java.util.ArrayListале повертає екземпляр java.util.Arrays.ArrayList.

Вам потрібно буде перетворити на ArrayList, якщо ви хочете отримати доступ до ArrayListпевної інформації

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

0

Перевірений підхід.

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

    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.