Список <String> в проблему преобразования ArrayList <String>
У меня есть следующий метод... который фактически принимает список предложений и разбивает каждое предложение на слова. Вот он:
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 и мне нужен массивList? Если я попытаюсь бросить его, это не тренировка... никаких предложений?
Кроме того, если я изменил ArrayList на List в HashMap, я получаю
java.lang.UnsupportedOperationException
из-за этой строки в моем коде
sentenceList.add(((Element)sentenceNodeList.item(sentenceIndex)).getTextContent());
Любые лучшие предложения?
Ответы
Ответ 1
Прежде всего, почему карта a 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+")));
Ответ 2
Cast работает, где фактический экземпляр списка - ArrayList
. Если это, скажем, a Vector
(что является еще одним расширением List
), оно выдает исключение ClassCastException.
Ошибка при изменении определения вашего HashMap связана с обработкой элементов, которые обрабатываются, и этот процесс ожидает метод, который определяется только в ArrayList
. Исключение говорит вам, что он не нашел метод, который он искал.
Создайте новый ArrayList
с содержимым старого.
new ArrayList<String>(myList);
Ответ 3
Посмотрите ArrayList # addAll (Collection)
Добавляет все элементы указанной коллекции в конец этот список, в том порядке, в котором они возвращаются указанным коллекция Итератор. Поведение этой операции undefined, если указанная коллекция изменяется во время работы прогресс. (Это означает, что поведение этого вызова undefined, если указанная коллекция - это список, и этот список не пуст.)
Итак, вы можете использовать
ArrayList<String> listOfStrings = new ArrayList<>(list.size());
listOfStrings.addAll(list);
Ответ 4
Arrays.asList
не возвращает экземпляр java.util.ArrayList
но возвращает экземпляр java.util.Arrays.ArrayList
.
Вам нужно будет преобразовать в ArrayList, если вы хотите получить доступ к конкретной информации ArrayList
allWords.addAll(Arrays.asList(strTemp.toLowerCase().split("\\s+")));
Ответ 5
В Kotlin List можно преобразовать в ArrayList, передав его в качестве параметра конструктора.
ArrayList(list)