Проблема преобразования списка в ArrayList


у меня есть следующий метод...который фактически берет список предложений и разбивает каждое предложение на слова. Вот это:

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 в следующем формате

HashMap<String, ArrayList<String>>

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

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

java.lang.UnsupportedOperationException

из-за этой линии в моем код

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

другие предложения?

4 63

4 ответа:

прежде всего, почему карта a HashMap<String, ArrayList<String>>, а не 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+")));

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

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

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

new ArrayList<String>(myList);

посмотри ArrayList#addAll (Collection)

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

Так что в принципе вы могли бы использовать

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

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

вам нужно будет преобразовать в ArrayList, если вы хотите получить доступ ArrayList конкретная информация

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