2012-05-28 100 views
4

循环遍历枚举的最佳方式是什么?循环遍历枚举

我有一个枚举方向,我想循环遍历它。目前我已经在枚举中实现了下一个方法,它返回下一个值,我只是想知道是否有更好的方式/内置支持循环遍历。

当前代码

enum Direction { 
    east, north, west, south; 

    Direction next() { 

     switch (this) { 
     case east: 
      return north; 

     case north: 
      return west; 

     case west: 
      return south; 

     case south: 
      return east; 
     } 

     return null; 
    } 
} 

回答

6

转换为int(通过ordinal()),循环并转换回枚举(通过values[i])。

像这样:

Direction next() { 
    return values()[(ordinal() + 1) % values().length]; 
} 
1

你可以使用枚举值已经通过他们分配给他们的循环整数值的事实。

8

这将是实现一个循环Iterator很简单:

enum Direction implements Iterable<Direction> { 
    east, north, west, south; 

    @Override 
    public Iterator<Direction> iterator() { 
     return new DirectionIterator(); 
    } 

    class DirectionIterator implements Iterator<Direction> { 

     Direction next = Direction.this; 

     @Override 
     public Direction next() { 
      try { 
       return next; 
      } finally { 
       next = values()[(next.ordinal() + 1) % values().length]; 
      } 
     } 

     @Override 
     public boolean hasNext() { 
      return true; 
     } 

     @Override 
     public void remove() { 
      throw new NotImplementedException(); 
     } 
    } 
} 

用法:

public static void main(String[] args) { 

    Iterator<Direction> it = Direction.north.iterator(); 

    for (int i = 0; i < 10; i++) 
     System.out.println(it.next()); 
} 

输出:

north 
west 
south 
east 
north 
west 
south 
east 
north 
west 
+0

使用aioobe在枚举本身上放置next()方法的想法,甚至可以为'iterator()'的所有调用返回相同的迭代器实例。 –

+0

...这是多一点线程安全。 – dacwe

+0

糟糕,你是对的。我还没有足够的咖啡 - 这些信息与调用者有关,而不是迭代器。所以每个调用者都有自己的迭代器。 –