Проблема преобразования списка в 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 ответа:
прежде всего, почему карта a
HashMap<String, ArrayList<String>>, а неHashMap<String, List<String>>? Есть ли какая-то причина, почему значение должно быть конкретной реализацией интерфейсаList(ArrayListв данном случае)?
Arrays.asListне возвращает ajava.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+")));