CyclicIteration.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:3k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.util;
  19. import java.util.Iterator;
  20. import java.util.Map;
  21. import java.util.NavigableMap;
  22. import java.util.NoSuchElementException;
  23. /** Provide an cyclic {@link Iterator} for a {@link NavigableMap}.
  24.  * The {@link Iterator} navigates the entries of the map
  25.  * according to the map's ordering.
  26.  * If the {@link Iterator} hits the last entry of the map,
  27.  * it will then continue from the first entry.
  28.  */
  29. public class CyclicIteration<K, V> implements Iterable<Map.Entry<K, V>> {
  30.   private final NavigableMap<K, V> navigablemap;
  31.   private final NavigableMap<K, V> tailmap;
  32.   /** Construct an {@link Iterable} object,
  33.    * so that an {@link Iterator} can be created  
  34.    * for iterating the given {@link NavigableMap}.
  35.    * The iteration begins from the starting key exclusively.
  36.    */
  37.   public CyclicIteration(NavigableMap<K, V> navigablemap, K startingkey) {
  38.     if (navigablemap == null || navigablemap.isEmpty()) {
  39.       this.navigablemap = null;
  40.       this.tailmap = null;
  41.     }
  42.     else {
  43.       this.navigablemap = navigablemap;
  44.       this.tailmap = navigablemap.tailMap(startingkey, false); 
  45.     }
  46.   }
  47.   /** {@inheritDoc} */
  48.   public Iterator<Map.Entry<K, V>> iterator() {
  49.     return new CyclicIterator();
  50.   }
  51.   /** An {@link Iterator} for {@link CyclicIteration}. */
  52.   private class CyclicIterator implements Iterator<Map.Entry<K, V>> {
  53.     private boolean hasnext;
  54.     private Iterator<Map.Entry<K, V>> i;
  55.     /** The first entry to begin. */
  56.     private final Map.Entry<K, V> first;
  57.     /** The next entry. */
  58.     private Map.Entry<K, V> next;
  59.     
  60.     private CyclicIterator() {
  61.       hasnext = navigablemap != null;
  62.       if (hasnext) {
  63.         i = tailmap.entrySet().iterator();
  64.         first = nextEntry();
  65.         next = first;
  66.       }
  67.       else {
  68.         i = null;
  69.         first = null;
  70.         next = null;
  71.       }
  72.     }
  73.     private Map.Entry<K, V> nextEntry() {
  74.       if (!i.hasNext()) {
  75.         i = navigablemap.entrySet().iterator();
  76.       }
  77.       return i.next();
  78.     }
  79.     /** {@inheritDoc} */
  80.     public boolean hasNext() {
  81.       return hasnext;
  82.     }
  83.     /** {@inheritDoc} */
  84.     public Map.Entry<K, V> next() {
  85.       if (!hasnext) {
  86.         throw new NoSuchElementException();
  87.       }
  88.       final Map.Entry<K, V> curr = next;
  89.       next = nextEntry();
  90.       hasnext = !next.equals(first);
  91.       return curr;
  92.     }
  93.     /** Not supported */
  94.     public void remove() {
  95.       throw new UnsupportedOperationException("Not supported");
  96.     }
  97.   }
  98. }