【问题标题】:Removing an item from a list using ListIterator使用 ListIterator 从列表中删除项目
【发布时间】:2012-09-19 02:52:25
【问题描述】:

代码:

 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 中删除卡片。我不知道如何正确地做到这一点。

【问题讨论】:

  • 谢谢,我是java新手。无论我如何做,我基本上想要做的是将 c1 设置为列表中的随机字符串,然后从列表中删除该字符串,但将 c1 保留为选择的字符串。换句话说,假设在我的列表中,选择的字符串之一是“hi” - c1 将设置为“hi”,然后字符串“hi”将从列表中删除,但 c1 仍将设置为它.

标签: java arrays string list


【解决方案1】:

您没有使用迭代器从集合中删除元素。您正在从刚刚实例化的迭代器中调用 remove 。如果您查看ListIterator 文档,您将看到remove

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

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

在任何情况下都不需要使用迭代器。 List&lt;E&gt; 中的 remove(int index) 方法可以解决问题:

String c1 = list.remove(rand.nextInt(list.size));

【讨论】:

    【解决方案2】:

    我同意杰克的观点。此外,您可以通过调用Collections.shuffle(list) 来替换使用Random 类。顾名思义,它将为您随机化您的列表。使用您的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"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-20
      • 2012-02-01
      • 1970-01-01
      • 2016-05-08
      • 2011-03-18
      • 1970-01-01
      相关资源
      最近更新 更多