Java 为什么迭代器remove()方法不删除任何内容?
我正在尝试使用迭代器标准的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;
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你可以用几行代码来替换大多数脆弱的命令式代码。