Преобразование Iterable в массив
мне нужно вернуть String
массив. Я использую гуаву, чтобы разделить String
. Пожалуйста, смотрите код ниже
Iterable<String> arrayOfValues = Splitter.on(";").split(myString);
возвращает Iterable
. но мне нужен String[]
. Есть ли способ дать Iterator< Element >
и преобразовать их в Array[]
. Большое Спасибо
8 ответов
использовать Iterables.toArray(Iterable<? extends T> iterable, Class<T> type)
метод гуавы.
Если вы используете простую строку Java.метод split (regex), вы в порядке. Он возвращает строку[].
"my;string".split(";")
String[] splits = mystring.split(";");
Не используйте причудливые библиотеки, если они вам не нужны.
вы также можете использовать гуава это FluentIterable :
FluentIterable.from(Splitter.on(":").split(mystring)).toArray(String.class)
без Guava вы можете преобразовать Iterable<String>
массиву с чем-то вроде этого
public static <String> String[] toArray(Iterable<String> itr) {
ArrayList<String> ret = new ArrayList<>();
for(String t : itr) {
ret.add(t);
}
return ret.toArray(new String[]);
}
немного сложно написать общую версию этой функции из-за множество проблем с общими массивами в Java, поэтому аккуратнее.
в java 8 я предпочитаю использовать поток для преобразования iterable в массив:
StreamSupport.stream(yourIterable.spliterator(), false).toArray(String[]::new)
в guava вы можете преобразовать его следующим образом
String test= "Welcome to java world";
Iterable<String> tokens=Splitter.on(" ").split(test);
String array[]=Iterables.toArray(tokens,String.class);
Если вы просто хотите получить доступ к элементам итератора, таким как массив, нет необходимости преобразовывать. Вы можете напрямую получить доступ к этим элементам по индексу
Эл.г
System.out.println(Iterables.get(tokens,2));
хотя в вопросе говорится "преобразовать итератор в массив", ответы объясняют только, как преобразовать Iterable в Array.
Итак, для преобразования итератора в массив с Guava вы можете использовать Iterators.toArray(Iterator<? extends T> iterator, Class<T> type)
.
Я действительно согласен с ответом @rec:не используйте причудливые библиотеки, если они вам не нужны.
но я настоятельно рекомендую прочитать разделитель гуавы документация:
потому что Java builtin splitter может иметь некоторые сложные поведения..
например, предположим, что у вас есть конечные запятые или последовательные запятые во входных данных. Что будет возвращено после раскол?
null
""
- (отбрасывается)
;)