好的,所以该类的目标是覆盖Enumeration对象类中的两个方法。我相信我的hasNextElement()
方法应该可行,任何关于它的指针都会受到赞赏。但是,我遇到了nextElement()
方法的麻烦。请原谅整个班级的不当评论,但nextElement()
的目标是一次返回一个角色。我认为它只是一个简单的循环,但netBeans一直给我不兼容的数据类型,这是有道理的,因为它的String方法不是Char方法。所以我把它改成char,我得到了
nextElement() in StringEnumeration cannot implement nextElement() in Enumeration return type char is not compatible with String where E is a type-variable:
非常感谢任何帮助。请记住我是一名初学程序员,所以我可能做错了很容易解决的问题。
public class StringEnumeration implements Enumeration<String> {
public String value;
public StringEnumeration(String initialValue) throws InvalidStringException {
if (initialValue == null || initialValue.length() == 0) {
throw new InvalidStringException("initialValue is either null or 0");
}
this.value = initialValue;
}
@Override
public boolean hasMoreElements() {
return value.length() != 0 || value != null;
}
@Override
public String nextElement() {
StringBuffer test = new StringBuffer(value);
for (int i = 0; i < value.length(); i++) {
return test.charAt(i);
}
}
}
答案 0 :(得分:1)
//know acess modifiers well...
private String value;
private Integer currentPosition;
public StringEnumeration(String initialValue) throws InvalidStringException {
if (initialValue == null || initialValue.length() == 0) {
throw new InvalidStringException("initialValue is either null or 0");
}
this.value = initialValue;
}
//you would return false when the list is empty OR the current position is
//past the end of the string
@Override
public boolean hasMoreElements() {
return value.length() != 0 || currentPosition < value.length();
}
//you would return the character at the current position
@Override
public char nextElement() {
return value.charAt(currentPosition++);
}
答案 1 :(得分:1)
最简单的方法是将您所使用的索引保留为枚举中的变量:
// we return characters
public class StringEnumeration implements Enumeration<Character> {
// the value
private String value;
// current index
private int idx=0;
public StringEnumeration(String initialValue) throws IllegalArgumentException {
if (initialValue == null || initialValue.length() == 0) {
throw new IllegalArgumentException("initialValue is either null or 0");
}
this.value = initialValue;
}
@Override
public boolean hasMoreElements() {
// can we still read
return idx<value.length();
}
@Override
public Character nextElement() {
// get current char and increment index
return value.charAt(idx++);
}
}
答案 2 :(得分:1)
我认为你打算实现的是给定字符串字符的Iterator<T>
:
public class StringEnumeration implements Iterator<Character> {
private final String value;
private int index = 0;
public StringEnumeration(String initialValue) {
if(initialValue == null) {
this.value = "";
} else {
this.value = initialValue;
}
}
@Override
public boolean hasNext() {
return index < value.length();
}
@Override
public Character next() {
try {
return test.charAt(this.index);
} finally {
this.index++;
}
}
@Override
public void remove() {
//can be done. Necessary?
}
}
(您只需将Iterator<Character>
替换为Enumeration<Character>
;将hasNext
和next
替换为hasMoreElements
和{{1},即可使用Enumeration<T>
并删除nextElement
方法。
此迭代器认为remove
字符串和空字符串null
都包含零字符。
迭代器需要在迭代过程中存储一个状态:要枚举的字符的""
。最初,index
设置为index
。在每个项目之后,索引会递增。
此外,测试只是该值是否已达到0
的结尾。
您的代码的主要问题如下:
String
您使用@Override
public String nextElement() {
StringBuffer test = new StringBuffer(value);
for (int i = 0; i < value.length(); i++) {
return test.charAt(i);
}
}
- 循环但使用return语句。如果您因此要求for
Java将开始迭代并立即nextElement
第一个字符。此外,这可能不会编译,因为Java编译器无法计算return
至少有一个元素,因此test
循环可能永远不会被执行。
请务必填写字段for
。通过将字段公开,类不再能保证其状态的一致性。
此外private
是Iterator
的现代版本(虽然对此有一些讨论)。
答案 3 :(得分:1)
您的实施有几个问题。
首先,在Enumeration<E>
中,E
不是枚举正在处理的类型。这是nextElement()
方法应该返回的类型。因此,Enumeration<String>
有一个返回nextElement()
的{{1}}方法。但是您的实现会返回String
的结果 - 一个返回原始charAt()
的方法,而不是char
!你要么必须返回某种字符串(可能是单个字符串字符串,如String
)或"m"
(因为你不能使Character
成为像{{1}这样的原始类型})。
下一个问题是您的E
方法实际上并不正确。 char
旨在一次为您提供一个元素(在您的情况下为字符),每次调用hasNextElement()
时,它都向前移动到最后的数据。因此,Enumeration
必须根据是否还有其他元素返回nextElement()
。但是,对于相同的字符串,您的实现将始终返回true。它不会指示何时停止呼叫hasNextElement()
。
最后,你的true
不知何故认为它会同时返回所有元素。这不行。每次调用nextElement()
时,nextElement()
只能提供一个元素。因此在其中使用循环毫无意义。执行此操作的正确方法是将状态保留在Enumeration
对象中,例如名为nextElement()
的变量,指示下一个元素的位置。每次调用者调用Enumeration
时,您将获取该元素,前进next
并返回该元素。一次一个元素,没有循环。实际循环将由使用nextElement()
的人创建,而不是由next
本身创建。
这个Enumeration
字段(或任何您想要调用的字段)可以帮助您创建正确的Enumeration
方法。如果next
超出字符串末尾,则hasMoreElements()
必须返回false,next
必须抛出hasMoreElements()
。