gpt4 book ai didi

java - 在 Java 中遍历 boolean 数组

转载 作者:行者123 更新时间:2023-11-29 04:55:12 32 4
gpt4 key购买 nike

我想在带有 boolean 标志的数组上编写迭代器。我的类实现接口(interface) Iterable。类的主要思想是实现整数子数组。例如,我想将 10 到 20 之间的数字放入数组中。如果数字在数组中,则数组中会有真正的初始位置。数字 10 在数组中的索引为 0,等等。

我写了这个子类:

private class RangeIter implements Iterator<Integer> {

private int currentIndex = 0;

@Override
public boolean hasNext() {
return currentIndex < size;


}

@Override
public Integer next() {
if (!hasNext()) {
throw new NoSuchElementException("No elements more!");
}
Integer element = currentIndex;
if (!elementFlags[currentIndex]) {
currentIndex++;
}
return element + lowerBound;
}
}

这段代码中使用的变量是:lowerBound:数组中较低的可能元素size: 数组的大小 (upperBound - lowerBound +1 )

我的问题是:为什么这个迭代器不起作用?

这是我的其余代码:

public class FixedRangeIntegerSet implements Iterable<Integer> {

private boolean[] elementFlags;
private int size;
private int lowerBound;
private int upperBound;

public FixedRangeIntegerSet(int lowerBound, int upperBound) {
this.lowerBound = lowerBound;
this.upperBound = upperBound;
int size = upperBound - lowerBound + 1;
elementFlags = new boolean[size + 1];
this.size = size;
}

public FixedRangeIntegerSet(int lowerBound, int upperBound, Iterable<Integer> elements) {
int sizeCopy = size;
for (Integer element : elements) {
if (sizeCopy > 0) {
add(element);
sizeCopy--;
}
}
}

public FixedRangeIntegerSet(int lowerBound, int upperBound, Integer... elements) {
for (int i = 0; i < elements.length; i++) {
add(elements[i]);
}
}

public boolean add(Integer element) {
if (elementFlags[element - lowerBound] == true) {
return false;
}
elementFlags[element - lowerBound] = true;
return true;
}

public boolean containsElement(Integer element) {
if (element < lowerBound || element > upperBound) {
return false;
}
if (elementFlags[element - lowerBound] == true) {
return true;
} else
return false;
}

public int getSize() {
int size = 0;
for (Boolean i : elementFlags) {
if (i == true) {
size++;
}
}
return size;
}

public int getLowerBound() {
return lowerBound;
}

public int getUpperBound() {
return upperBound;
}

public boolean remove(Integer element) {
if (elementFlags[element - lowerBound] == false) {
return false;
} else {
elementFlags[element - lowerBound] = false;
return true;
}
}

最佳答案

你没有给我们所有相关的代码,但只是从你的 hasNextnext 方法我可以看到一些问题:

  1. currIndex 仅在 elementFlags[currentIndex] 为 false 时才会前进,这意味着您的迭代器将卡在数组包含 true 的第一个索引处。

  2. 我认为您想遍历索引,直到找到数组包含 true 的下一个索引,然后返回该索引。

  3. 您应该初始化迭代器,使初始 currentIndex 满足 elementFlags[currentIndex] 为真。

建议的实现:

private class RangeIter implements Iterator<Integer> {

private int currentIndex = 0;

public RangeIter ()
{
currentIndex = 0;
while (currentIndex < size && !elementFlags[currentIndex])
currentIndex++;
}

@Override
public boolean hasNext() {
return currentIndex < size;
}

@Override
public Integer next() {
if (!hasNext()) {
throw new NoSuchElementException("No elements more!");
}
Integer element = currentIndex;
while (currentIndex < size && !elementFlags[currentIndex]) {
currentIndex++;
}
return element + lowerBound;
}

}

关于java - 在 Java 中遍历 boolean 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34059615/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com