Java 为什么迭代器remove()方法不删除任何内容?

Java 为什么迭代器remove()方法不删除任何内容?,java,arrays,while-loop,iterator,Java,Arrays,While Loop,Iterator,我正在尝试使用迭代器标准的remove方法删除数组中最小的项。我通过实现一个迭代器来查找最小的项,然后实现第二个迭代器来删除它。我的代码如下 public Comparable removeMin() { Iterator<T> it = iterator(); T min; T next; if (it.hasNext()){ min = it.next(); } else { min = null;

我正在尝试使用迭代器标准的remove方法删除数组中最小的项。我通过实现一个迭代器来查找最小的项,然后实现第二个迭代器来删除它。我的代码如下

public Comparable removeMin() {

    Iterator<T> it = iterator();
    T min;
    T next;


    if (it.hasNext()){
        min = it.next();
    } else {
        min = null;
    }

    while (it.hasNext()) {
        next = it.next();
        if (min.compareTo(next) > 0) {
        min = next;
        }
    }

    Iterator<T> it2 = iterator();
    it2 = iterator();
    while (it2.hasNext()) {
        next = it2.next();
        if (min.compareTo(next) == 0) {
            it2.remove();
            break;
        }
    }

    return min;

}
public Comparable removeMin() {
  Iterator<T> it = iterator();
    T min;
    T next;


    if (it.hasNext()){
        min = it.next();
    } else {
        min = null;
    }


    while (it.hasNext()) {
        next = it.next();
        if (min.compareTo(next) > 0) {
        min = next;
        }
    }

    for (int i=0; i<size; i++) {
    if (data[i] == min) {
        data[i] = null;

        for (int j = i+1; j < data.length; j++) {
            data[j-1] = data[j];
        }

      }

    }

    size--;
    return min;

}
public可比removeMin(){
迭代器it=迭代器();
T分钟;
T下一步;
if(it.hasNext()){
min=it.next();
}否则{
最小值=零;
}
while(it.hasNext()){
next=it.next();
如果(最小值与(下一个)>0){
min=下一个;
}
}
迭代器it2=迭代器();
it2=迭代器();
while(it2.hasNext()){
next=it2.next();
如果(最小比较到(下一个)==0){
it2.删除();
打破
}
}
返回最小值;
}
这里是代码的主要部分

public static void main(String[] args) {

  Bag<String> sbag = new Bag<String>();
    System.out.println(sbag.size()); // 0

    sbag.add("a");
    sbag.add("b"); 
    sbag.add("c");
    sbag.add("d");
    sbag.add("e");

    sbag.removeMin();

    Iterator<String> it2 = sbag.iterator();
    while (it2.hasNext()) {
        String val = it2.next();
        System.out.println(val);

    }
}
publicstaticvoidmain(字符串[]args){
行李sbag=新行李();
System.out.println(sbag.size());//0
sbag.添加(“a”);
sbag.添加(“b”);
sbag.添加(“c”);
sbag.添加(“d”);
sbag.添加(“e”);
sbag.removeMin();
迭代器it2=sbag.Iterator();
while(it2.hasNext()){
字符串val=it2.next();
系统输出打印项次(val);
}
}
当我在main中运行该代码时,我希望得到
b、c、d、e
,因为
a
应该被删除。相反,我得到了
a,b,c,d,e
。这表示removeMin()方法工作不正常。我认为故障在第二个while循环中,使用
it2.remove()
命令,但我不知道我做错了什么


有谁能告诉我如何修复我的代码,以便
it2.remove()命令删除最小项?

我可以通过使用for循环而不是迭代器来解决这个问题。我的代码如下

public Comparable removeMin() {

    Iterator<T> it = iterator();
    T min;
    T next;


    if (it.hasNext()){
        min = it.next();
    } else {
        min = null;
    }

    while (it.hasNext()) {
        next = it.next();
        if (min.compareTo(next) > 0) {
        min = next;
        }
    }

    Iterator<T> it2 = iterator();
    it2 = iterator();
    while (it2.hasNext()) {
        next = it2.next();
        if (min.compareTo(next) == 0) {
            it2.remove();
            break;
        }
    }

    return min;

}
public Comparable removeMin() {
  Iterator<T> it = iterator();
    T min;
    T next;


    if (it.hasNext()){
        min = it.next();
    } else {
        min = null;
    }


    while (it.hasNext()) {
        next = it.next();
        if (min.compareTo(next) > 0) {
        min = next;
        }
    }

    for (int i=0; i<size; i++) {
    if (data[i] == min) {
        data[i] = null;

        for (int j = i+1; j < data.length; j++) {
            data[j-1] = data[j];
        }

      }

    }

    size--;
    return min;

}
public可比removeMin(){
迭代器it=迭代器();
T分钟;
T下一步;
if(it.hasNext()){
min=it.next();
}否则{
最小值=零;
}
while(it.hasNext()){
next=it.next();
如果(最小值与(下一个)>0){
min=下一个;
}
}

对于(inti=0;i我能够通过使用for循环而不是迭代器来解决这个问题

public Comparable removeMin() {

    Iterator<T> it = iterator();
    T min;
    T next;


    if (it.hasNext()){
        min = it.next();
    } else {
        min = null;
    }

    while (it.hasNext()) {
        next = it.next();
        if (min.compareTo(next) > 0) {
        min = next;
        }
    }

    Iterator<T> it2 = iterator();
    it2 = iterator();
    while (it2.hasNext()) {
        next = it2.next();
        if (min.compareTo(next) == 0) {
            it2.remove();
            break;
        }
    }

    return min;

}
public Comparable removeMin() {
  Iterator<T> it = iterator();
    T min;
    T next;


    if (it.hasNext()){
        min = it.next();
    } else {
        min = null;
    }


    while (it.hasNext()) {
        next = it.next();
        if (min.compareTo(next) > 0) {
        min = next;
        }
    }

    for (int i=0; i<size; i++) {
    if (data[i] == min) {
        data[i] = null;

        for (int j = i+1; j < data.length; j++) {
            data[j-1] = data[j];
        }

      }

    }

    size--;
    return min;

}
public可比removeMin(){
迭代器it=迭代器();
T分钟;
T下一步;
if(it.hasNext()){
min=it.next();
}否则{
最小值=零;
}
while(it.hasNext()){
next=it.next();
如果(最小值与(下一个)>0){
min=下一个;
}
}

对于(int i=0;i什么是
iterator()
do?i第二个PM。您的代码似乎很好(除了您为
it2
调用了两次iterator,但这不会导致任何故障),在这种情况下,您的
iterator()
实现可能有问题。@SayemAhmed,但是如果我在调用
it2.remove()
之前打印min和next,它们都会打印一个我所期望的。只是删除不起作用。这仍然是错误的标志吗
迭代器()
实现?看起来像是
Bag.remove()的问题
方法,而不是您的
removeMin()
方法。或者我猜它可能是一个坏的
compareTo()
方法;其中
x.compareTo(x)
不是零。您应该检查代码是否达到
it2.remove();
。添加一个System.out.println行,打印当前值以进行调试。什么是
迭代器()
do?我是第二个PM。您的代码似乎很好(除了您为
it2
调用了两次迭代器,但这不会导致任何故障),在这种情况下,您的
iterator()
实现可能有问题。@SayemAhmed,但是如果我在
it2.remove()之前打印min和next
call,它们都打印了一个,这是我所期望的。只是删除不起作用。这仍然是错误的标志吗
iterator()
implementation?看起来是
Bag.remove()
方法的问题,而不是你的
removeMin()
方法。或者它可能是一个坏了的
compareTo()
method我猜;其中
x.compareTo(x)
不是零。您应该检查代码是否达到
it2.remove();
。添加一行System.out.println,打印当前值以进行调试。如果您使用Java 8,您可能希望研究使用流来过滤此集合。您可以用几行代码替换大部分这段脆弱的命令性代码。如果您使用Java 8,您可能希望研究使用流来过滤此集合。Yo你可以用几行代码来替换大多数脆弱的命令式代码。