我正在尝试在Java中创建一个“Reverse Iterator”,它接受一个字符串并以相反的顺序输出每个字符串。这是我现在的代码:
//a b c d -> d c b a
class ReverseIterator implements Iterator<String> {
String given;
int index;
ReverseIterator(String given) {
this.given = given;
this.index = 0;
}
// is there a next?
public boolean hasNext() {
return this.index <= this.given.length();
}
// gets the next item
// effect: advances the index by one
public String next() {
String answer = this.given.substring(given.length() - this.index, given.length() - this.index - 1);
this.index = index + 1;
return answer;
}
}
我收到了String index out of range: -1
,但我不确定如何解决我的算法问题。
答案 0 :(得分:1)
所以有两件事是错的。
当您到达最后一个字符时,第一个return this.index <= this.given.length();
会产生错误,因为String
为零索引,即0
到length - 1
第二
this.given.substring(given.length() - this.index, given.length() - this.index - 1);
生成一个索引范围,其中endIndex
小于beginIndex
(因此错误String index out of range: -1
)
因此,如果index
为5,则您尝试从5
开始到4
结束的子字符串,这是无效的。你想要转换那些,更像是......
public String next() {
int from = given.length() - this.index - 1;
int to = given.length() - this.index;
String answer = this.given.substring(from, to);
this.index = index + 1;
return answer;
}
大部分内容都是通过一系列System.out.println
语句进行调试的,当你开始遇到这样的问题时,你需要花时间把变量分解出来(就像我上面做的那样)非常重要并检查实际值,这对于突出我们所犯的愚蠢错误非常有帮助
哦,我也同意String#charAt
似乎更有意义
答案 1 :(得分:1)
你在substring方法中的参数混淆了,这导致了异常:
对于长度为5的给定字符串,您希望从索引5到4访问子字符串,这是不可能的。
如果更改参数,则next()方法将最后一个char作为字符串返回。
现在你必须在你的代码中添加hasNext()方法和循环,你应该好好去。