【问题标题】:How to delete a random element from a ArrayList如何从 ArrayList 中删除随机元素
【发布时间】:2018-07-19 08:29:32
【问题描述】:

我有一个 ArrayList,我想随机获取一个元素,删除该元素并在没有该已删除元素的情况下进行另一个随机。我怎样才能做到这一点?我试过了,还是不行。

谢谢。

主活动:

public class MainActivity extends AppCompatActivity {

    Button button;
    TextView textView;

    ArrayList<Integer> list = new ArrayList<Integer>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button = (Button)findViewById(R.id.button);
        textView = (TextView)findViewById(R.id.textView);

        list.add(0);
        list.add(1);
        list.add(2);
        list.add(3);

    }

    public void button(View view) {
        Random rand = new Random();
        int randomElement = list.get(rand.nextInt(list.size()));
        if (list.isEmpty()) {
            textView.setText("Empty");
        } else if (randomElement == 0) {
            textView.setText("Red");
            list.remove(randomElement);
        } else if (randomElement == 1) {
            textView.setText("Blue");
            list.remove(randomElement);
        } else if (randomElement == 2) {
            textView.setText("Yellow");
            list.remove(randomElement);
        } else if (randomElement == 3) {
            textView.setText("Green");
            list.remove(randomElement);
        }
    }
}

【问题讨论】:

  • 很难理解你的问题是什么?
  • 使用listIterator

标签: java android arraylist random


【解决方案1】:

我知道您要做什么,但我建议采用不同的方法 - 改为将颜色放入列表中。

public enum Colors {
    GREEN, RED, YELLOW;
}

...

List<Colors> list = new ArrayList<Colors>(Arrays.asList(Colors.values()));
Random rand = new Random();

...

public void button(View view) {
    if (list.isEmpty()) {
        textView.setText("Empty");
    } else {
        Colors randomElement = list.remove(rand.nextInt(list.size()));
        textView.setText(randomElement.name());
    }
}

【讨论】:

    【解决方案2】:

    我认为您的问题是 remove() 在 ArrayList 中重载。它可以采用索引(int)或对象。我相信您的 remove 调用实际上是按索引删除,而您想要的是按对象删除。

    为了解决您的问题,我相信您应该可以通过remove(Integer.valueOf(randomElement)) 显式调用remove(Object) 版本。

    【讨论】:

    • 或者你可以输入 cast 。 list.remove((Integer)randomElement);
    • 是的。现在我看了一下,他可能也可以将 randomElement 声明为Integer,而不是拆箱。
    【解决方案3】:

    在每次按钮函数调用时,随机 int 都会获得当前可用列表大小的限制。因此,随机数将限制为数组列表中存在的元素数量。

    public void button (View view){
      Random r = new Random();
      int randomElement = list.get(r.nextInt(list.size()));
    
      if (list.isEmpty()) {
        textView.setText("Empty");
      } else {
        switch (randomElement) {
          case 1:
            textView.setText("Red");
            list.remove(randomElement);
            break;
          case 2:
            textView.setText("Blue");
            list.remove(randomElement);
            break;
          case 3:
            textView.setText("Yellow");
            list.remove(randomElement);
            break;
          case 4:
            textView.setText("Green");
            list.remove(randomElement);
            break;
        }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-18
      • 2013-02-24
      • 1970-01-01
      • 2018-11-05
      相关资源
      最近更新 更多