【问题标题】:Cycling through arrayList循环遍历arrayList
【发布时间】:2013-08-01 13:31:57
【问题描述】:

背景

我有一个从屏幕顶部“落”到底部的精灵(一个 openGL 四边形)。

当它到达屏幕底部时,它的值会被重置并重新开始(从上到下)但沿 X 轴移动到新的 X 位置。

我正在做的是将 X 位置存储在一个 ArrayList 中(可能只有 1 个,所以它一遍又一遍地落在同一个地方,或者 10 个,所以它每次下落时都会轻微移动)。

问题

我无法解决的是如何通过这个数组列表并将精灵的新 X 位置设置为“下一个”数组列表位置中保存的值,同时记住可能没有“下一个”位置。

所以.......(这是伪代码)......一旦精灵下降并且它的 Y 位置已重置回屏幕顶部:

spriteX = value_held_in_next_arrayList_position(if_there_is_one)

由于我的游戏的不同级别将有不同数量的位置,我不能明确地说“转到位置 2”,因为 arrayList 的大小仅为 1。基本上我想说的是“转到下一个位置” ' 和 '如果没有下一个位置' 则返回位置 0。

【问题讨论】:

    标签: java android arrays arraylist


    【解决方案1】:

    您可以使用列表中的whileIterator 迭代List

    List<YourElement> yourList;
    ...
    Iterator<YourElement> iterator = yourList.iterator();
    while(iterator.hasNext()) {
        final YourElement yourElement = iterator.next();        
        // Do whatever with yourElement
        if (iterator.hasNext()) {
            // Do whatever if there's a next element to yourElement
        }
    }
    

    【讨论】:

    • 谢谢@M0skit0,有两件事我不明白,1当我尝试它时,它永远不会在while循环中运行代码——即使我的arrayList中有4个元素——第二是这会从 arrayList 的开头开始迭代每次不是吗?这仅在精灵到达屏幕底部时运行,我需要它从当前正在使用的元素中选择下一个元素 - 如果有的话。
    • 1.那么很可能你在那个列表中没有元素,你认为你有它们。调试器说什么?确保从正确的列表中获取迭代器。
    • 2.然后仅当精灵到达屏幕底部时才运行循环。这只是如何迭代列表的示例。此外,如果您想选择已知元素的下一个元素,则无需搜索整个列表。将索引保留在当前使用元素的列表中,并添加一个。
    【解决方案2】:

    ArrayList 是可迭代的,所以这是使用an iterator 的好地方。假设您在迭代时没有修改列表。

    【讨论】:

    • 如果您使用迭代器,您甚至可以在迭代时删除元素。请参阅 Iterator#remove()。
    【解决方案3】:

    你想要做的是获取迭代器,然后执行一个 while 循环,如果迭代器有一个 next 你抓住它并继续,否则你出来。

    示例代码:

    Iterator positions = spriteXPositions.iterator();
    while(positions.hasNext()) {
        mySprite.position.X = positions.next();
    }
    

    【讨论】:

      【解决方案4】:

      我会使用一个迭代器对象。由于您希望它循环并且您不知道要从您那里抽象出它的大小。我们可以创建一个通用循环方法,它接受一个迭代器和父 ArrayList,如果它已经在末尾,则循环遍历它。

      private void loop(Iterator it, ArrayList parent) {
          if(!it.hasNext()) { 
              it = parent.iterator();
          } 
          //Your logic here instead of logging
          //Assume always at least 1 element in arraylist
          Log.d("test", it.next() + "");
      }
      

      我们可以测试一下:

      ArrayList<Float> positions = new ArrayList<Float>();
      positions.add(0.123123f);
      positions.add(0.2312f);
      positions.add(0.323123f);
      
      Iterator<Float> posIter = positions.iterator();
      for(int i = 0; i < 100; i++) {
          loop(posIter, positions);
      }
      

      【讨论】:

        【解决方案5】:

        您可以使用 % 运算符返回到列表列表的开头。

        int nextSpriteX() {
           currentXPositionIndex = (currentXPositionIndex + 1) % xPositions.size();
           return xPositions.get(currentXPositionIndex);
        }
        

        【讨论】:

          【解决方案6】:

          感谢所有提供答案的人,最后我采用了不同的方法,以防有人遇到类似问题,这就是我所做的:

          if (xPosition.get(0)<X.size()-1){
          
          xPosition.set(0, xPosition.get(0)+1);
          
          }
          
          else {xPosition.set(0, 1);
          }
          
          sprite.xScreen=xPosition.get(xPosition.get(0));
          

          xPosition 是一个数组列表,第一个元素只是指向另一个包含 X 位置的元素的指针 - 类似于:

          xPosition.add(1);  //Element 0 - pointer to subsequent elements (Points to element 1)
          xPosition.add(100); //Element 1 - X position 1
          xPosition.add(200)l //Element 2 - X position 2
          xPosition.add(400); //Elemen 3 - X Position 3
          
          Cheers!
          

          【讨论】:

            猜你喜欢
            • 2020-06-15
            • 2014-03-22
            • 2013-04-05
            • 1970-01-01
            • 1970-01-01
            • 2012-09-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多