将枚举转换为迭代器

12

我在一个工作表上有一个问题,需要创建适配器将Enumeration转换为Iterator。 当我尝试运行以下代码时,我会收到一个空指针异常。

import java.util.Vector;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Iterator;

public class ConvertEnumeration {

    public static void main(String [] args) {

        int [] ourArray = {0,1,2,3,4,5,6,7,8,9};
        Vector vector = new Vector(Arrays.asList(ourArray));

        //Get Enumerator 
        Enumeration enumerator = vector.elements();

        EnumerationToIterator enumToIt = new EnumerationToIterator(enumerator);
        while(enumToIt.hasNext()) {
            System.out.println(enumToIt.next());
        }
    }

}


//Convert our enumeration to Iterator!
class EnumerationToIterator implements Iterator {

    //Our enumeration
    Enumeration enmueration;

    //Constructor
    public EnumerationToIterator(Enumeration enmueration){
        enmueration = this.enmueration;
    }

    //Our Methods
    public boolean hasNext(){
        return enmueration.hasMoreElements();
    }

    public Object next(){
        return enmueration.nextElement();
    }

    public void remove(){
        throw new UnsupportedOperationException();
    }

}

另一个需要注意的是,我无法在创建枚举之后打印出整数。


你是否考虑将被接受的答案切换为这个?它比被接受的答案获得了近10倍的赞同票,而且这个问题是“java enumeration to iterator”搜索结果中排名靠前的一个,因此将主要答案更改为适用于大多数开发者需求的答案可能会更好。 - Thunderforge
原始问题的重点在于我要如何自己完成它。我知道其他答案有更多的赞,但它并没有解决我所提出的问题。 - TomSelleck
4个回答

55

Java 5及以后版本

无需重复造轮子。只需使用Collections.list(Enumeration<T> e),它将返回一个ArrayList<T>。然后使用ArrayList.iterator()获取一个Iterator

Java 9及以后版本

现在枚举类型具有直接转换为迭代器的方法

enumeration.asIterator();

7
使用适配器更好,因为元素数量可能非常庞大,而将所有元素存储在ArrayList中会增加内存消耗。 - Christian Ullenboom
2
@ChristianUllenboom 我不会因为有些情况下它更好就称之为更好。对于大多数用途,这个答案都是很好的。 - H.v.M.

8

Java 9提供了一个新的默认方法:Iterator<E> asIterator()



7

你的构造函数中有错误的赋值。应该是 this.enmueration = enmueration;
enmueration 是构造函数的参数,而 this.enmueration 是对象属性。


啊,这是学生级错误,谢谢!有个问题,虽然这样消除了错误,但当我尝试打印出原始值时,它只会打印一个内存地址(我猜的),例如“[I@38f0b51d”。尝试将其转换为int会出现以下错误:“无法将I转换为java.lang.Integer”。 - TomSelleck
你的System.out.println();里面是什么? - jlordo
我更新了原始代码 - 可能还不可见。如果它解决了问题,请告诉我。 - jlordo
1
@jlordo:提醒一下,您的编辑已被拒绝,因为它改变了原始帖子的代码。您应该编辑您的答案,包括适当修改过的代码,而不是编辑原始(有缺陷的)代码。 - nneonneo
1
是的,我理解你的动机。不幸的是,编辑原始代码以修复错误也会有破坏该问题本身的风险。因此,建议的方法是将相关部分复制并修改到您自己的帖子中。希望对你有帮助,感谢你的回答! - nneonneo
显示剩余2条评论

4
public class ConvertEnumeration {

    public static void main(String [] args) {

        // int [] ourArray = {0,1,2,3,4,5,6,7,8,9};
        Vector<Integer> vector = new Vector<Integer>(Arrays.asList(0,1,2,3,4,5,6,7,8,9));

        //Get Enumerator 
        Enumeration<Integer> enumerator = vector.elements();

        EnumerationToIterator<Integer> enumToIt = new EnumerationToIterator<Integer>(enumerator);
        while(enumToIt.hasNext()) {
            System.out.println(enumToIt.next());
        }
    }

}    

//Convert our enumeration to Iterator!
    class EnumerationToIterator<T> implements Iterator<T> {

        //Our enumeration
        Enumeration<T> enmueration;

        //Constructor
        public EnumerationToIterator(Enumeration<T> enmueration){
            this.enmueration = enmueration;
        }

        //Our Methods
        public boolean hasNext(){
            return enmueration.hasMoreElements();
        }

        public T next(){
            return enmueration.nextElement();
        }

        public void remove(){
            throw new UnsupportedOperationException();
        }
    }

在你的主类中添加泛型类型有帮助吗?请查看我的更新答案。 - jlordo
尝试使用mate仍然没有运气,代码行"Vector<Integer> vector = new Vector<Integer>(Arrays.asList(ourArray));"出现了错误,提示"The constructor Vector<Integer>(List<int[]>) is undefined." - TomSelleck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接