2012-05-28 202 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

糟糕,你是對的。我還沒有足夠的咖啡 - 這些信息與調用者有關,而不是迭代器。所以每個調用者都有自己的迭代器。 –