我从数组中随机选择一个字符串,在选择它之后我想制作它,以便我不能再次选择该字符串。我应该“删除”它还是有更好的方法?
这是我随机选择它的代码,
position = positionList[(int) (Math.random() * positionList.length)];
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
,以后的,那么您可能可以复制它。
最简单的方法是
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);
}
我会说你基本上有三个选择。
首先,您需要了解 Java 中的数组具有不可变的长度。如果你创建一个有 5 个元素/槽的数组,它总是有 5 个元素。你不能改变它。
因此,您实际上无法删除数组的第 i 个元素。您可以执行以下操作之一:
您可以将位置 i 处的元素设置为null
(假设这是一个对象数组)。
您可以创建一个新数组,该数组由旧数组的元素组成,而您正在“删除”的元素除外。但请注意,您实际上并没有更改原始数组。
还有第三种选择。根本不要使用数组。使用 aList
代替;例如一个ArrayList
或可能一个LinkedList
取决于您的应用程序的要求。该 API 允许您将元素添加到列表中并从列表中删除元素......除此之外还有更多。
(使用 aArrayList
而不是数组的缺点是前者占用更多空间并且速度稍慢。但是除非空间使用和/或性能是您的应用程序的关键问题,否则它不太重要。)