是否存在与Python的“枚举”函数等价的Java?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (48)

在Python中,该enumerate函数允许你迭代(索引,值)对的序列。例如:

>>> numbers = ["zero", "one", "two"]
>>> for i, s in enumerate(numbers):
...     print i, s
... 
0 zero
1 one
2 two

有什么办法在Java中做到这一点?

提问于
用户回答回答于

对于实现该List接口的集合,可以调用该listIterator()方法来获取ListIterator。迭代器(除其他外)有两种方法 - nextIndex()获取索引; 并用next()获取值(像其他迭代器一样)。

因此,以上Python的Java等价物可能是:

List<String> numbers = Arrays.asList("zero", "one", "two");
ListIterator<String> it = numbers.listIterator();
while (it.hasNext()) {
    System.out.println(it.nextIndex() + " " + it.next());
}

它像Python一样输出:

0 zero
1 one
2 two
用户回答回答于

严格地说,不,因为Python中的enumerate()函数返回元组列表,并且Java中不存在元组。

然而,如果你感兴趣的是打印一个索引和一个值,那么你可以按照Richard Fearn的建议,在迭代器上使用nextIndex()和next()。

还要注意,可以使用更一般的zip()函数(使用Python语法)定义enumerate():

mylist = list("abcd")
zip(range(len(mylist)), mylist)

给出[(0,'a'),(1,'b'),(2,'c'),(3,'d')]

如果你定义了自己的Tuple类,那么你当然可以在Java中编写自己的zip()函数来使用它(使用链接):

public static <X,Y> List<Tuple<X,Y>> zip(List<X> list_a, List<Y> list_b) {
    Iterator<X> xiter = list_a.iterator();
    Iterator<Y> yiter = list_b.iterator();

    List<Tuple<X,Y>> result = new LinkedList<Tuple<X,Y>>();

    while (xiter.hasNext() && yiter.hasNext()) {
        result.add(new Tuple<X,Y>(xiter.next(), yiter.next()));
    }

    return result;
}

一旦你有zip(),实现枚举()就很简单了。

扫码关注云+社区

领取腾讯云代金券