我是从一个数组中随机选择一个字符串,在选中它之后我想这样做,以便我不能再选择那个字符串。我应该“删除”它还是有更好的方法?
这是我随机选择的代码,
position = positionList[(int) (Math.random() * positionList.length)];
答案 0 :(得分:5)
如果您使用ArrayList
而不是array
,则删除会是更好的选择。因为在数组的情况下,你必须重新调整它的大小(这意味着你必须每次都创建一个新的数组 - 致命的想法。避免它),或者将选择的索引设置为{{ 1}}。
但是这种方法(设置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
,稍后一个,那么可能您可以复制它。
答案 1 :(得分: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);
}
答案 2 :(得分:0)
我说你基本上有三个选择。
答案 3 :(得分:0)
首先,您需要了解Java中的数组具有不可变长度。如果创建一个包含5个元素/槽的数组,它将始终具有5个元素。你无法改变它。
所以你实际上无法删除数组的第i个元素。您可以做的是以下之一:
您可以将位置i的元素设置为null
(假设这是一个对象数组)。
您可以创建一个新阵列,该阵列由旧阵列的元素组成,而不是您正在“删除”的元素。但请注意,您并非实际更改原始数组。
还有第三种选择。根本不要使用数组。请改用List
;例如一个ArrayList
或LinkedList
取决于您的应用程序的要求。 API允许您向列表添加元素并从列表中删除元素......还有更多。
(使用ArrayList
而不是数组的缺点是前者占用的空间略小,而且速度稍慢。但是除非空间使用和/或性能 critical < / em>对您的申请的关注。)