0

コード:

 Random Picker = new Random();
 List<String> list = new ArrayList<String>();
  list.add("card1");
  list.add("card2");
  list.add("card3");


  ListIterator listIterator = list.listIterator();
  String c1, c2, c3;
  c1 = list.get(Picker.nextInt(list.size()));
  listIterator.remove();

これを行うと、Javaエラーが発生します。私がやろうとしているのは、c1をに設定してlist.get(Picker.nextInt(list.size())); から、選択したカードをリストから削除することです。つまり、文字列c1をリストからランダムに選択し、選択したカードをリストから削除して、値c1のままにします。選択したものを削除すると、文字列c1からカードも削除されるため、現在のコードは機能しないと思います。これを正しく行う方法がわかりません。

4

2 に答える 2

1

コレクションから要素を削除するためにイテレータを使用していません。インスタンス化されたばかりのイテレータからremoveを呼び出しています。ListIteratorドキュメントを見ると、次のようになりますremove

この呼び出しは、次または前の呼び出しごとに1回だけ行うことができます。これは、次または前への最後の呼び出しの後にListIterator.addが呼び出されていない場合にのみ行うことができます。

これはnext()、イテレータを呼び出して最初の要素をフェッチしなくても、まだ不正な状態にあることを意味します。

いずれの場合も、イテレータを使用する必要はまったくありません。からのremove(int index)メソッドList<E>はトリックを行います:

String c1 = list.remove(rand.nextInt(list.size));
于 2012-09-19T03:05:16.817 に答える
1

私はジャックに同意します。Randomさらに、を呼び出すことでクラスを使用して置き換えることができますCollections.shuffle(list)。名前が示すように、それはあなたのためにあなたのリストをランダム化します。次に、を使用listIteratorしてリストを繰り返し、カードを選択して、別のリストに保存できます。次のようになります。

List<String> list = new ArrayList<String>();
list.add("card1");
list.add("card2");
list.add("card3");

Collections.shuffle(list);

ListIterator<String> listIterator = list.listIterator();
List<String> pickedCards = new ArrayList<String>();

while(listIterator.hasNext()) {
    pickedCards.add(listIterator.next());
}

String c1 = pickedCards.get(0);
String c2 = pickedCards.get(1);
String c3 = pickedCards.get(2);

c1、c2、およびc3の値は、、、およびのよう"card2""card1"なります。"card3"

于 2012-09-19T03:24:52.603 に答える