0

我想使用枚举跳过某个请求参数。我使用下面的代码,但它没有给我想要的结果。谁能告诉我如何从枚举中跳过一个元素或者下面的代码有什么问题?

 for (Enumeration<String> e = request.getParameterNames(); e.hasMoreElements();) {
        if("James".equalsIgnoreCase(e.nextElement().toString())) {
            e.nextElement();
            continue;
        } else {
            list.add(e.nextElement().toString());
        }
    }
4

3 回答 3

3

您在nextElement()每个循环中多次调用跳过多个元素。您只需调用nextElement()一次。就像是...

for (Enumeration<String> e = request.getParameterNames(); e.hasMoreElements();) {
    String value = e.nextElement();
    if(!"James".equalsIgnoreCase(value)) {
        list.add(value);
    }
}
于 2012-12-18T08:42:57.320 回答
1

问题是,您e.nextElement()if. 这将消耗两个元素。

您应该首先将元素存储在 String 类型中,然后进行比较:-

for (Enumeration<String> e = request.getParameterNames(); e.hasMoreElements();) {
    String elem = e.nextElement();
    if("James".equalsIgnoreCase(elem)) {
        continue;
    } else {
        list.add(elem);
    }
}

toString()之后你就不需要了e.nextElement()。它只会给你String,因为你使用的是泛型类型。


附带说明一下,在这种情况下,我更喜欢使用while循环,因为迭代次数不固定。以下是您的等效while循环版本for-loop: -

{
    Enumeration<String> e = request.getParameterNames();

    while (e.hasMoreElements()) {
        String elem = e.nextElement();
        if(!"James".equalsIgnoreCase(elem)) {
            list.add(elem);
        } 
    }

}
于 2012-12-18T08:43:38.217 回答
1

因为每次调用 nextElement()所以每次调用这个方法都会从枚举中获取下一个元素。如果在枚举中没有对象并且您将尝试获取它,您也可能会遇到异常。

NoSuchElementException - if no more elements exist.

所以只需更改您的代码并nextElement()只调用一次。

for (Enumeration<String> e = request.getParameterNames(); e.hasMoreElements();) {
    String str= e.nextElement().toString();
    if("James".equalsIgnoreCase(str)) {
        continue;
    } else {
        list.add(str);
    }
}
于 2012-12-18T08:47:33.360 回答