我有一个自定义类的对象数组,我想删除一个随机对象(按某些条件选择)。我该怎么做并保持阵列的有序?自然地,会向左移动元素但我不完全删除元素部分并需要帮助制定逻辑。这是我正在做的,但因为它无法正常工作:(
public static void deleteRecord(Customer[] records, int AccId){
int pos=0; // index
boolean found = false;
for (int i=0; i<count; i++){ // count is the number of elements in the array
if (records[i].get_accountid()==AccId){
found = true;
pos = i;
break;
}
}
if (!found)
System.out.println("The Record doesn't exist");
for (int j=pos+1; j<count; j++) {
records[j-1]= records[j];
}
答案 0 :(得分:4)
您可以将元素移到左侧,因为这会覆盖要删除的项目。
public void remove(Object[] a, int index) {
for (int i = index + 1; i < a.length && a[i] != null; i++) {
a[i - 1] = a[i];
}
}
假设第一个null
表示元素的结束。
当然,这是O(n)时间,并且像LinkedList这样的数据结构可以在O(1)时间内删除元素。
答案 1 :(得分:2)
不幸的是,你不能只是从数组中删除一个元素,不能没有留下空索引或创建一个新数组。我将创建一个新数组并使用System.arraycopy来简化对元素的复制。类似的东西:
Object[] newArr = new Object[arr.length-1];
System.arraycopy(arr,0,newArr,0,index);
System.arraycopy(arr,index+1, newArr, index, newArr.length - index);
return newArr;
arr
是原始数组,index
是要删除的随机索引。基本上,它将所有元素复制到索引以删除,然后复制索引后的所有元素。为简单起见,您可以将其包装在单独的方法中。 (而不是使用arraycopy
,你可以使用两个for循环来完成同样的事情。)
我强烈建议其他人必须使用List,这样可以简化添加和删除元素。
答案 2 :(得分:1)
使用List集合,例如:
List<String> list = new ArrayList<String>();
int toDelete = getRandomIndex(lst.size()); //your own implementation
if (toDelete >= 0) {
list.remove(toDelete); // it'll remove and shift elements
}
关于List.remove(int)的文档:
删除指定的元素 此列表中的位置(可选 操作)。随后转移 左边的元素(减去一个 来自他们的指数)。返回 从中移除的元素 列表。