2009-06-26 5 views

答えて

2

関数オブジェクト[]のtoArrayを一般に

17

([] Aオブジェクト)を使用して配列にコレクションを変換は、良い方法は、存在しません。はい、あなたはそれらを反復することができます。これはtoArray(そして他の関数)がどのように動作するかです。しかし、反復順序は必ずしも固定されているわけではありません。一般的なコレクションにインデックスを作成しようとしているなら、おそらく何か間違っているでしょう。 Listにインデックスを設定すると効果的です。

46

すべきではありません。 Collectionは、特定のコレクションに意味をなさない可能性があるため、特にインデックスに関する話題を避けています。たとえば、Listは何らかの形式の注文を意味しますが、Setは注文しません。

elem = World 
    elem = Hello 
    myCollection.toArray()[0] = World 

ながら:

myCollection = new ArrayList<String>(); 
    myCollection.add("Hello"); 
    myCollection.add("World"); 

    for (String elem : myCollection) { 
     System.out.println("elem = " + elem); 
    } 

    System.out.println("myCollection.toArray()[0] = " + myCollection.toArray()[0]); 

は私を与える:

Collection<String> myCollection = new HashSet<String>(); 
    myCollection.add("Hello"); 
    myCollection.add("World"); 

    for (String elem : myCollection) { 
     System.out.println("elem = " + elem); 
    } 

    System.out.println("myCollection.toArray()[0] = " + myCollection.toArray()[0]); 

は私与え

elem = Hello 
    elem = World 
    myCollection.toArray()[0] = Hello 

なぜあなたはこれをしたいですか?あなたはコレクションを反復するだけではありませんか?

+0

は@butterchickenこんにちは、私の場合は私が(設定ある)キーセットを取得するのLinkedHashMapを使用することです。私はこの記事を見つけました:http://stackoverflow.com/questions/2923856/is-the-order-guaranteed-for-the-return-of-keys-and-values-from-a-linkedhashmap-oこのセットは保証されています。私はそれ以上のことをまだ分からないはずですか? – jobbert

+1

@jobbertあなたはそれを絶対に繰り返すことができます。 'Map'のインタフェースの契約であるため、この場合は' Set'を返します。 – butterchicken

4

コレクションにはリスト(new ArrayList(c))をラップするか、c.toArray()を使用する必要があります。コレクションには「インデックス」または「オーダー」という概念がないからです。

14

私は(ライブラリがあなたのコレクションを返すので)マシューFlaschenの答えに同意し、ちょうどあなたがリストに切り替えることはできません場合のオプションの例を示したかった:

List list = new ArrayList(theCollection); 
list.get(5); 

または

Object[] list2 = theCollection.toArray(); 
doSomethingWith(list[2]); 

ジェネリックが何であるか知っていれば、そのサンプルも提供できます。

編集:元のコレクションの意図と意味は別です。

+1

ライブラリ関数がCollectionを返す場合、そのコレクション内の要素の順序についてはあなたが保証しているとは思われません。おそらくライブラリ呼び出しは、あなたがこの種の仮定をしたくないので、コレクションを正確に返します。 – butterchicken

+0

良い点。 OPは彼がどのような種類の図書館を使用しているかに関する十分な情報を共有していなかった。いくつかのライブラリは、具体的な実装の代わりにいくつかのスーパーインタフェースを返すベストプラクティスについて開発者が読んでいるため、Collectionを返します。ライブラリは、(AXIOMの場合のように)結果をループする以外の何かを許可するつもりがなければ、Iterableを返すことができます。 – akarnokd

1

あなたは決定的Listをしたい:

Listインタフェースは、リスト要素との位置(インデックス化)アクセスのための4つのメソッドを提供します。 リスト(Java配列など)はゼロベースです。

これらの動作は、(例えば、LinkedListのクラス)一部 実装のためにインデックス値に比例した時間で実行できるようにしても

注意。したがって、呼び出し元が の実装を知らない場合は、>リスト内の要素を反復処理することは、通常、それを介してインデックスを作成する方が望ましいです。

あなたのコレクションを修正するために、インデックスが必要な場合は、そのリストを注意してくださいあなたは、インデックスを取得することができ、特別なListIteratorを提供しています。私は、これは一般的に悪い考えであることに同意

List<String> names = Arrays.asList("Davide", "Francesco", "Angelocola"); 
    ListIterator<String> i = names.listIterator(); 

    while (i.hasNext()) { 
     System.out.format("[%d] %s\n", i.nextIndex(), i.next()); 
    } 
1

更新されるたび単にあなたのコレクションがリストに変換するために、同じように便利です。しかし、初期化する場合は、これで十分です。

 for(String i : collectionlist){ 
     arraylist.add(i); 
     whateverIntID = arraylist.indexOf(i); 
    } 

オープンにしてください。各ループの

0

使用...

ArrayList<Character> al=new ArrayList<>(); 

String input="hello"; 

for(int i=0;i<input.length();i++){ 
      al.add(input.charAt(i)); 
     } 

     for (Character ch : al) { 

      System.Out.println(ch) 

} 
関連する問題