Проблема преобразования списка <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>>

поэтому этот метод возвращает список, и мне нужен arrayList? Если я попробую применить, ничего не получится ... есть предложения?

Кроме того, если я изменю ArrayList на List в HashMap, я получу

java.lang.UnsupportedOperationException

из-за этой строки в моем коде

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

Есть предложения лучше?

Шкипер07
источник

Ответы:

53

Прежде всего, почему карта а, HashMap<String, ArrayList<String>>а не а HashMap<String, List<String>>? Есть ли причина, по которой значение должно быть конкретной реализацией интерфейса List( ArrayListв данном случае)?

Arrays.asListне возвращает 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, позволит избежать этого.
Дункан Джонс,
191

Cast работает там, где фактическим экземпляром списка является файл ArrayList. Если это, скажем, a Vector(что является еще одним его расширением List), он выдаст исключение ClassCastException.

Ошибка при изменении определения вашего HashMap связана с тем, что элементы обрабатываются позже, и этот процесс ожидает метод, который определен только в ArrayList. Исключение сообщает вам, что не удалось найти искомый метод.

Создайте новый ArrayListс содержимым старого.

new ArrayList<String>(myList);
SJuan76
источник
41

Взгляните на ArrayList # addAll (Коллекция)

Добавляет все элементы указанной коллекции в конец этого списка в том порядке, в котором они возвращаются Iterator указанной коллекции. Поведение этой операции не определено, если указанная коллекция изменяется во время выполнения операции. (Это означает, что поведение этого вызова не определено, если указанная коллекция является этим списком, а этот список не пуст.)

Итак, в основном вы можете использовать

ArrayList<String> listOfStrings = new ArrayList<>(list.size());
listOfStrings.addAll(list);
Безумный программист
источник
13

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

    }
С Кришна
источник