0

我从数组中随机选择一个字符串,在选择它之后我想制作它,以便我不能再次选择该字符串。我应该“删除”它还是有更好的方法?

这是我随机选择它的代码,

position = positionList[(int) (Math.random() * positionList.length)];
4

4 回答 4

5

ArrayList如果您使用 an而不是.,则删除将是更好的选择array。因为在数组的情况下,您将不得不重新调整它的大小(这意味着您必须每次都创建一个新数组 -致命的想法。避免它),或者将选择的索引设置为null.

但是这种方法(设置null)的问题在于,您可能必须多次进行随机选择才能获得一个有效的随机索引,尤其是当您只剩下1有效索引时。因此,最好使用 a List,并从中删除选定的元素。

List<String> list = new ArrayList<String>();  

// Populate your list.

Collections.shuffle(list);        // Shuffle the list.
String random = list.remove(0);   // Will remove the first element

请注意,如果您想要原始的ArrayList,以后的,那么您可能可以复制它。

于 2013-02-20T06:51:15.460 回答
3

最简单的方法是

positionList[(int) (Math.random() * positionList.length)] = null;

但这似乎更接近你想要的

    String[] a = { "1", "2", "3", "4" };
    List<Integer> positions = new ArrayList<>(a.length);
    for (int i = 0; i < a.length; i++) {
        positions.add(i);
    }
    Collections.shuffle(positions);
    while(!positions.isEmpty()) {
        int i = positions.remove(positions.size() - 1);
        System.out.println(i);
    }
于 2013-02-20T06:49:40.763 回答
0

我会说你基本上有三个选择。

  1. 不要使用数组。您可以改用列表,这样您就可以轻松删除元素
  2. 按照其他答案中的建议将数组元素设置为 null
  3. 跟踪到目前为止您在某种数据结构中选择的数组位置,并在每次生成随机数时检查它。
于 2013-02-20T06:53:14.540 回答
0

首先,您需要了解 Java 中的数组具有不可变的长度。如果你创建一个有 5 个元素/槽的数组,它总是有 5 个元素。你不能改变它。

因此,您实际上无法删除数组的第 i 个元素。您可以执行以下操作之一:

  • 您可以将位置 i 处的元素设置为null(假设这是一个对象数组)。

  • 您可以创建一个新数组,该数组由旧数组的元素组成,而您正在“删除”的元素除外。但请注意,您实际上并没有更改原始数组。

还有第三种选择。根本不要使用数组。使用 aList代替;例如一个ArrayList或可能一个LinkedList取决于您的应用程序的要求。该 API 允许您将元素添加到列表中并从列表中删除元素......除此之外还有更多。

(使用 aArrayList而不是数组的缺点是前者占用更多空间并且速度稍慢。但是除非空间使用和/或性能是您的应用程序的关键问题,否则它不太重要。)

于 2013-02-20T06:57:44.397 回答