169

int、int[] fooなどのプリミティブの配列があります。サイズが小さいかもしれませんし、そうでないかもしれません。

int foo[] = {1,2,3,4,5,6,7,8,9,0};

そこからを作成する最良の方法は何Iterable<Integer>ですか?

Iterable<Integer> fooBar = convert(foo);

ノート:

ループを使用して回答しないでください (コンパイラがそれらについてどのようにスマートに処理するかについて適切な説明を提供できる場合を除きます)。

また、

int a[] = {1,2,3};
List<Integer> l = Arrays.asList(a);

コンパイルすらしない

Type mismatch: cannot convert from List<int[]> to List<Integer>

また 、配列を Iterable に割り当てられないのはなぜですか?も確認してください。 答える前に。

また、いくつかのライブラリ (Guava など) を使用している場合は、これが最適である理由を説明してください。(Googleからの回答は完全な回答ではないため:P)

最後に、それについて宿題があるようですので、宿題的なコードを投稿することは避けてください。

4

10 に答える 10

136
Integer foo[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };

List<Integer> list = Arrays.asList(foo);
// or
Iterable<Integer> iterable = Arrays.asList(foo);

Integerただし、これを機能させるには、配列(配列ではなく)を使用する必要がありますint

プリミティブの場合、guavaを使用できます。

Iterable<Integer> fooBar = Ints.asList(foo);
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>15.0</version>
    <type>jar</type>
</dependency>

ラムダを使用するJava8の場合:(JinKwonの回答に触発されました)

final int[] arr = { 1, 2, 3 };
final Iterable<Integer> i1 = () -> Arrays.stream(arr).iterator();
final Iterable<Integer> i2 = () -> IntStream.of(arr).iterator();
final Iterable<Integer> i3 = () -> IntStream.of(arr).boxed().iterator();
于 2012-04-26T14:40:26.803 に答える
49

ちょうど私の2セント:

final int a[] = {1,2,3};

java.lang.Iterable<Integer> aIterable=new Iterable<Integer>() {

    public Iterator<Integer> iterator() {
       return new Iterator<Integer>() {
            private int pos=0;

            public boolean hasNext() {
               return a.length>pos;
            }

            public Integer next() {
               return a[pos++];
            }

            public void remove() {
                throw new UnsupportedOperationException("Cannot remove an element of an array.");
            }
        };
    }
};
于 2013-01-10T00:20:12.103 に答える
20

Guava は、必要なアダプターをInt.asList()として提供します。関連するクラスの各プリミティブ型 ( Booleansforbooleanなど) に相当するものがあります。

int foo[] = {1,2,3,4,5,6,7,8,9,0};
Iterable<Integer> fooBar = Ints.asList(foo);
for(Integer i : fooBar) {
    System.out.println(i);
}

上記の使用Arrays.asListする提案は、.Iterator<int[]>ではなくIterator<Integer>. 何が起こるかというと、配列に基づくリストを作成するのではなく、配列を含む 1 要素の配列リストを作成したことになります。

于 2013-01-11T04:18:53.850 に答える
8

私は同じ問題を抱えていて、次のように解決しました:

final YourType[] yourArray = ...;
return new Iterable<YourType>() {
  public Iterator<YourType> iterator() {
     return Iterators.forArray(yourArray);   // Iterators is a Google guava utility
  }
}

イテレータ自体は怠惰ですUnmodifiableIteratorが、それはまさに私が必要としていたものです。

于 2013-03-27T14:12:57.473 に答える
4

まず第一に、Arrays.asList(T...)非プリミティブ データ型を持つ Wrapper 型または配列の最適なソリューションであることに同意することしかできません。このメソッドは、基本的に指定された配列参照をフィールドとして保存し、必要なメソッドをオーバーライドしてリストをシミュレートする、クラス内の単純なプライベート静的AbstractList実装のコンストラクターを呼び出します。 配列に対してプリミティブ型または Wrapper 型のどちらかを選択できる場合、そのような状況では Wrapper 型を使用しますが、もちろん、常に有用または必須というわけではありません。実行できる可能性は 2 つだけです: 1) 各プリミティブ データ型配列 ( WrapperTypeを返す) の静的メソッドを持つクラスを作成できます。これらのメソッドは(ほかにArrays



boolean, byte, short, int, long, char, float, doubleIterable<>IteratorIterableint[])メソッドを実装するために、構成するメソッドの引数 (たとえば ) の参照をフィールドとして含めることができます。

->このアプローチはパフォーマンスが高く、メモリを節約します(新しく作成されたメソッドのメモリを除いて、使用Arrays.asList()すると同じようにメモリが必要になります)

2)配列にはメソッドがないため(サイドで読み取られるため)あなたがリンクした)彼らもIteratorインスタンスを提供できません。新しいクラスを書くのが本当に面倒なら、実装する既存のクラスのインスタンスを使用する必要があります。これは、インスタンス化またはサブタイプIterable以外に方法がないためです。 実装する既存の Collection 派生物を作成する唯一の方法Iterable
Iterableループを使用するか(上記のように匿名クラスを使用する場合を除く)Iterable、コンストラクターがプリミティブ型配列を許可する実装クラスをインスタンス化します(Object[]プリミティブ型要素を持つ配列を許可しないため)が、私が知る限り、Java APIそのようなクラスはありません。

ループの理由は簡単に説明できます
。コレクションごとにオブジェクトが必要であり、プリミティブ データ型はオブジェクトではありません。オブジェクトはプリミティブ型よりもはるかに大きいため、プリミティブ型配列の各要素に対して生成する必要がある追加のデータが必要です。つまり、3 つのうち 2 つの方法 (Arrays.asList(T...)既存のコレクションを使用するか、または既存のコレクションを使用する) でオブジェクトの集約が必要な場合、int[]ラッパー オブジェクトを配列します。3番目の方法は、配列をそのまま使用し、匿名クラスで使用します。パフォーマンスが速いため好ましいと思います。配列を使用したいメソッドの as 引数を

使用する 3 番目の戦略もあります。または、引数の型を特定するために型チェックが必要になりますが、通常は必要になるため、まったくお勧めしません。オブジェクトが常に必要なタイプであるとは限らず、特定のケースでは別のコードが必要になることを考慮してください。 結論として、単純に使用することで多くのコードを節約するジェネリック型としてプリミティブ型を使用することを許可しない Java の問題のあるジェネリック型システムの欠点です。ObjectIterable

Arrays.asList(T...). したがって、プリミティブ型配列ごとにプログラムする必要があります。そのようなメソッドが必要です (これは、使用される型引数ごとに個別のメソッドを作成する C++ プログラムによって使用されるメモリと基本的に違いはありません。

于 2015-04-29T17:54:43.167 に答える