如何在随机选择数组后从数组中删除字符串? Java
我从数组中随机选择一个字符串,在选择它之后,我想使它不能再次选择该字符串。我应该“删除”它还是有更好的方法?如何在随机选择数组后从数组中删除字符串? Java
这里是我的代码随机选择它,
position = positionList[(int) (Math.random() * positionList.length)];
最简单的方法是
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);
}
删除会如果您使用ArrayList
而不是array
,则更好。因为在数组的情况下,你将不得不重新调整它的大小(这意味着,你必须每次创建一个新的数组 - 致命的想法,避免它),或将选择的索引设置为null
。
但是这种方法(设置null
)的问题是,您可能必须多次进行随机选择才能获得一个有效的随机索引,尤其是当您仅剩下有效索引1
时。因此,最好使用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
,后一个,那么很可能你可以让一个副本。
我会说你基本上有三种选择。
- 请勿使用数组。您可以使用列表来代替它,它可以让您轻松删除元素
- 将数组元素设置为null,如其他答案中的建议
- 跟踪您在某种数据结构中选择的阵列位置并在每次生成随机数时检查它。
首先,您需要了解Java中的数组具有不可变的长度。如果您创建一个包含5个元素/插槽的阵列,它将始终有5个元素。你不能改变这一点。
所以你几乎不能删除数组的第i个元素。你可以做的是下列之一:
您可以在位置设置i的元素
null
(假设这是对象的数组)。您可以创建一个新阵列,该阵列由旧阵列的元素组成,除了您正在“删除”的元素之外。但是请注意,你并不是实际上是改变原来的数组。
还有第三个选项。根本不要使用数组。改为使用List
;例如一个ArrayList
或可能是一个LinkedList
取决于您的应用程序的要求。该API允许您将元素添加到列表中,并从列表中删除元素...以及更多内容。
(使用ArrayList
,而不是一个数组是,前者需要稍微更大的空间,是或多或少地更慢的缺点,但它是不太可能的事情,除非空间使用和/或性能都关键关注您的应用程序。 )
将选定的字符串存储到位,然后将其设置为null在数组内?如果我想走这条路,我需要为整个数组做一个字符串比较? – Ryan 2013-02-20 07:07:27
@Ryan。是的,这可能是可能的,但不要这样做。为什么?看到我对第一个答案的评论。 – 2013-02-20 07:12:11
那也能够将选定的字符串存储到位,然后使其为空? – Ryan 2013-02-20 06:52:01
这可能是最简单的方法,但效率非常低。考虑一下你只剩下一个非空索引的情况。然后它可能需要随机数生成器运行多次才能获得该索引。 – 2013-02-20 07:08:41
猜测给定数组长度为“100”的情况下,从'(int)(Math.random()* positionList.length)'得到索引'5'的概率是多少?这就是问题。 – 2013-02-20 07:13:49