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

每次调用下一个或上一个时,此调用只能进行一次。只有在最后一次调用 next 或 previous 之后没有调用 ListIterator.add 时,才能执行此操作。

这意味着,如果不调用next()迭代器来获取第一个元素,您仍然处于非法状态。

无论如何,根本不需要使用迭代器。from的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 回答