web-dev-qa-db-ja.com

Guerを使用してIterableを配列に変換する

String配列を返す必要があります。グアバを使用してStringを分割します。以下のコードをご覧ください

Iterable<String> arrayOfValues =  Splitter.on(";").split(myString);

Iterableを返します。 String[]が必要です。 Iterator< Element >を指定してArray[]に変換する方法はありますか?どうもありがとう

22
stacktome

Guavaで Iterables.toArray(Iterable<? extends T> iterable, Class<T> type) メソッドを使用します。

35
Narendra Pathai

単純なJava String.split(regex)メソッドを使用している場合は問題ありません。String[]を返します。

"my;string".split(";")

String[] splits = mystring.split(";");

必要のないファンシーライブラリは使用しないでください。

21
rec

Java 8では、イテラブルを配列に変換するためにストリームを使用することを好みます:

StreamSupport.stream(yourIterable.spliterator(), false).toArray(String[]::new)
7
Andy Brown

Guavaの FluentIterable を使用することもできます:

FluentIterable.from(Splitter.on(":").split(mystring)).toArray(String.class)
4

グアバがなければ、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の汎用配列に関する無数の問題 のため、この関数の汎用バージョンを書くのは少し難しいので、軽く踏み込んでください。

2
9999years

@recの答えに本当に同意します:必要ない場合はファンシーライブラリを使用しないでください

しかし、私はグアバのスプリッターを読むことを強くお勧めします ドキュメント

なぜなら、Java組み込みスプリッターには、いくつかのトリッキーな動作があるかもしれないからです。

たとえば、入力に末尾のカンマまたは連続するカンマがあるとします。分割後に何が返されますか?

  • null
  • ""
  • (破棄)

;)

1

グアバでは次のように変換できます

 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));
0
Sam

質問には「イテレータを配列に変換する」と書かれていますが、回答では、Iterableを配列に変換する方法のみを説明しています。

したがって、イテレータをGuavaで配列に変換するには、Iterators.toArray(Iterator<? extends T> iterator, Class<T> type)を使用できます。

0
Taylan