【问题标题】:Looping data structure in JavaJava中的循环数据结构
【发布时间】:2013-12-03 05:02:55
【问题描述】:

是否有循环遍历数据结构的迭代器?

假设有一个数组:

int[] arr = {-1,5,7,-1,-1,-1}

我想从这个数组中找到第一个非-1值的索引并开始从随机位置搜索 (idx = random.nextInt(arr.length) )。例如 idx = 4;

所以首先检查 arr[4] == -1,然后检查 arr[5] == -1 等等。 如果到达数组的末尾,则从 0 位置开始并继续直到找到非 -1。保证数组中至少有一个不等于-1的值。

可以这样做:

int idx = -1;
for (int i = random.nextInt(arr.length); ; i++) {
   if (i == arr.length) {
        /** start over */
        i = 0;
   }
   if (-1 != arr[i]) {
       idx = i;
       break;
   }
}

左右:

int idx = -1;
int i   = random.nextInt(arr.length);

do {
   if (-1 != arr[i]) {
      idx = i;
   }      
   i == arr.length ? i=0 : i++;
} while (-1 == idx);

是否有支持循环的迭代器(调用 next() ,如果到达数组末尾则自动从 0 开始)?

局限:1)不考虑效率; 2) 首选标准Java API。

【问题讨论】:

  • 可以构建这样一个迭代器,但与使用已有的循环相比,它不够清晰、效率更低,也更不容易。

标签: java arrays loops iterator


【解决方案1】:

在 java API 中没有这样的 api 可以满足您的问题,但您可以自己制作。

你可以做的是使用List来创建LinkedList。来解决你的问题。

您可以将 List 扩展到您的班级 (CircularLinkedList extends List),然后覆盖方法 hasNext() & getNext() 这就是您所需要的。

【讨论】:

    【解决方案2】:

    我认为没有任何迭代器可以让您在调用next() 时知道元素的索引,因此您必须单独跟踪当前索引。您也许可以使用 Guava 的 Iterators.concat(或其他第三方类)构建一个“环绕”迭代器,将数组尾部的迭代器与前导部分的迭代器连接起来。不过,我认为代码可能比一两个简单的for 循环更复杂。

    【讨论】:

      【解决方案3】:

      我相信没有这样的循环迭代器会在到达数组末尾后自动转到数组的开头。我在下面创建了一个(未经测试,设计有缺陷),它需要一个全新的代码类,并且比你的短 for/while 循环长得多。

      public class MyCircularIterator<E> implements Iterator<E> {
          private List<E> list;
          private int pos;
      
          public MyCircularIterator(List<E> list) {
              this(list, 0);
          }
      
          public MyCircularIterator(List<E> list, int start) {
              this.list = list;
              pos = start;
          }
      
          public boolean hasNext() {
              if(list.get(pos) != -1) return false;
                  return true;
          }
      
          public E next() {
              if(hasNext()) {
                  E obj = list.get(pos);
                  pos = (pos + 1) % list.size();
                  return obj;
              }
          }
      
          public void remove() {
               list.remove(this.nextIndex); 
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-04-28
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多