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