StringEnumeration(一般枚举)

时间:2015-05-28 15:29:41

标签: java enumeration

好的,所以该类的目标是覆盖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);
        }

    }
}

4 个答案:

答案 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>;将hasNextnext替换为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。通过将字段公开,类不再能保证其状态的一致性。

此外privateIterator现代版本(虽然对此有一些讨论)。

答案 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()