2011-03-27 121 views
0

我有我的自定义类的对象数组,我想删除一个随机对象(由某些条件选择)。我如何做到这一点,并保持阵列的秩序?自然,会有向左移动的元素,但我不完全删除元素部分,需要帮助来制定逻辑。这是我在做什么,但它不能正常工作:(从数组中删除对象

 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]; 
      } 
+4

如果您打算随机删除元素,通常应该使用列表。 – 2011-03-27 16:04:54

+0

可能的重复[如何从java中的数组中删除对象?](http://stackoverflow.com/questions/112503/how-do-i-remove-objects-from-an-array-in-java) – McDowell 2011-05-09 10:26:02

回答

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)的时间和有像链表,可以删除元素在O(1)时间的数据结构。

+3

...但在LinkedList中,如果它不是在其中一个端点上,你仍然需要'O(n)'来查找要删除的元素。 – 2011-03-27 16:45:45

+0

我编辑了这个问题。我的代码似乎不工作:/ – dawnoflife 2011-03-27 16:54:39

+0

啊,真的!我想,如果你在一个迭代器内,你可以在不断的时间内去除元素? – 2011-03-27 16:55:38

1

使用List集合e.g:

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):

移除此列表中指定位置 元素(可选 操作)。将任何随后的 元素向左移(从其索引中减去一个 )。返回从 列表中删除的 元素。

+0

不幸的是不允许使用列表收集。我编辑了这个问题......我的代码似乎没有工作。帮助将不胜感激 – dawnoflife 2011-03-27 16:59:10

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-loop来完成同样的事情)。

我强烈建议其他人必须使用List,这可以简化添加和删除元素。

+0

我们不允许使用列表集合来完成此任务 – dawnoflife 2011-03-27 16:58:28

+0

note注意System.arraycopy比手动复制数组更快,因为它本身实现。 – MeBigFatGuy 2011-03-27 18:51:07