我正在尝试通过自定义迭代器从Array中删除元素,并且需要从数组中删除元素。我知道使用数组不是很实用,但是由于某些原因,我有一些限制。
问题是我无法使用删除的元素创建另一个数组并更改引用。因为我在定制的Iterator类中没有真正的参考。我需要更改为真正的参考。让我用代码更好地解释这一点:
<!-- HTML -->
<button class="terug">Click Me</button>
<img class="popup" src="images/popup1.png" alt="beoordeling">
我可以通过删除指定元素来创建缓冲区副本,并将缓冲区引用更改为该副本。但我希望此删除可以影响实际数组。所以我 实际需要更改arr []。
同样,我知道在具有Collection层次结构时,对数组的整个使用是毫无意义的,但是我需要以这种方式解决这一问题。在这种情况下,对引用的引用不是一个很好的术语,但是我在C ++中对此有一个实现,并且正在寻找某种类似于指针的指针。
谢谢。
答案 0 :(得分:1)
在您的示例中已经是这种情况了...
将buffer
设置为arr
,可以创建引用的副本到堆中的同一Array,其中包含所有元素的相同引用。
事实是,如果要删除元素,则不应该以这种方式使用数组。
您只需使用相同类型元素的列表即可。
更改实现,以使用List<E>
而不是数组,您将能够对其调用remove方法,并且对原始传递的list实例生效。
答案 1 :(得分:0)
如果要“指针的指针”,我有两种方法:第一种方法是创建仅包含一个元素的数组,第二种方法是创建自己的包含该元素的包装器类。
我将给出第一种方法的示例:
public class Iterator<E>
{
private E[][] pointerToPointer;
private E[] buffer; // underlying buffer.
private int idx; // location of iterator in buffer.
private E last_element; // last element returned by this iterator.
public Iterator(E[][] pointerToPointer)
{
this.pointerToPointer = pointerToPointer;
buffer = pointerToPointer[0];
idx = 0;
}
/**
* Removes from the underlying collection the last element returned
* by this iterator.
*/
public void remove()
{
// create your new array (let's call it newArr)
...
buffer = newArr;
pointerToPointer[0] = buffer;
}
}
然后,当您调用迭代器时,必须创建一个单例数组:
Integer[] arr = ...
Integer[][] pointerToPointer = {arr};
Iterator<Integer> it = new Iterator<>(new Integer[][]{pointerToPointer});
//use your iterator, including remove() method
...
arr = pointerToPointer[0]; //this gets the modified array
无论如何,是什么让您无法向返回域Iterator
的{{1}}类添加方法?
答案 2 :(得分:0)
Java是按值传递而不是按引用传递,这意味着;您正在复制数据,然后让垃圾收集器(GC)负责其余的工作。因此,您没有C ++中的指针。
这是我的想法,有一个不良的副作用-数组是固定的,并分配给解析给构造函数的数组(已删除索引,但替换为null):
public void remove(int index) {
@SuppressWarnings("unchecked")
E[] tmp = (E[])new Object[this.buffer.length]; // Can cause issues on some types
int x = 0; // Variable to track tmp's index counter
for(int i = 0; i < this.buffer.length; i++) {
if(i != index) {
x++;
tmp[x] = this.buffer[i];
}
}
this.buffer = tmp;
}