【问题标题】:ArrayList Find First and Last ElementArrayList 查找第一个和最后一个元素
【发布时间】:2012-06-11 04:10:34
【问题描述】:

晚上好,

我有一个 ArrayList(实例化为 ld_data),我向前和向后迭代 / 向用户显示元素数据。在这个过程中,我需要知道我何时处于第一个元素和最后一个元素。检测我何时处于我这样做的最后一个元素:

if((index + 1) <= ld_data.size())
{
    ....
}

这是可行的,因为 size 属性也是 ArrayList 的上限。然而,检测我何时处于第一个元素对我来说并不容易。我能想到的最好的就是这似乎很蹩脚....但它的工作原理。

if((index - 1) >= (ld_data.size() - ld_data.size()))
{
    ....
}

在 C# .NET 世界中,我们有 ArrayList.UpperBound 或 ArrayList.LowerBound 在 Java 中是否有类似的东西?

JB

编辑:更多细节。因此,有关更多信息,我将绑定到 ListView。因此,当用户滚动到列表的第一个元素时,我想显示一条消息“在列表的开头”,当他们到达末尾时显示“列表的结尾”。我知道有一个滚动条可以使这一点变得明显,我只是想举一个例子来说明我在做什么。所以这个检查发生在“OnScroll”事件中。

【问题讨论】:

标签: java android


【解决方案1】:

始终建议使用IteratorsListIterator 来遍历列表。当您修改列表数据(删除或插入元素)时,使用列表大小作为参考并不适用。

迭代器 - 允许调用者在一个方向上迭代列表,并在迭代过程中以明确定义的语义从底层集合中删除元素

您可以使用ListIterator 来遍历列表。 ListIterator 允许程序员以任一方向遍历列表,在迭代期间修改列表,并获取迭代器在列表中的当前位置。你可以参考下面的例子。

ArrayList<String> list = new ArrayList<String>();
    ListIterator<String> iterator = list.listIterator();
    while(iterator.hasNext()){
        System.out.println(iterator.next());
        ...
        ...
        System.out.println(iterator.previous());
        if(!iterator.hasPrevious()){
            System.out.println("at start of the list");
        }else if(!iterator.hasNext()){
            System.out.println("at end of the list");
        }

    }

这只是一个ListIterator的用法示例,请分析您的需求并根据需要实施。

【讨论】:

    【解决方案2】:
    List<YourData> list = new ArrayList<YourData>();
    
    for(int index=0; index < list.size(); index++) {
    
        YourData currElement = list.get(index);
    
        if(index == 0) {
            //currElement is the first element
        }
    
        if(index == list.size() - 1) {
             //currElement is the last element
        }
    }
    

    【讨论】:

    • -1 BUG : 如果 size 为 0,那么第一个元素将是零,并且不会找到最后一个元素,并且 for 循环是不必要的。
    • @FasteKerinns:好吧,如果大小为 0,那么 index&lt;list.size() 将评估为 false,因此循环将永远不会执行。
    • 是的,你是对的,很抱歉我错过了“
    • 我也喜欢你的想法。这样,您将获得对第一个和最后一个元素的引用。我只是使用了循环,因为这就是 OP 似乎正在做的事情。
    【解决方案3】:

    我建议您为此使用Google Guava。如果列表为空,getLast 方法将抛出 NoSuchElementException

    lastElement = Iterables.getLast(iterableList);
    

    并获取第一个元素:

    firstElement = Iterables.getFirst(iterable, defaultValue)
    

    有关 Java 集合的更多信息,check it out

    【讨论】:

      【解决方案4】:

      只需检查索引是否等于 0。第一个元素始终驻留在此索引中。

      【讨论】:

      • 不确定我是否在关注这个。 list.indexOf(Object) 是我看到的唯一与索引相关的方法。
      • 好吧,你可以使用等号来检查你是否在第一个元素。例如,for(int i=0; i
      【解决方案5】:

      ArrayLists 的底部索引始终为 0。所以if (index &gt; 0) { // okay to decrement } 可以正常工作。

      你也可以请求一个列表迭代器

      ListIterator<Item> i = ld_data.listIterator();
      
      if (i.hasNext()) {
          Item item = i.next();
      }
      
      // and
      
      if (i.hasPrevious()) {
          Item item = i.previous();
      }
      

      【讨论】:

      • 虽然其他解决方案有效,但 ListIterator 最适合我的情况。
      【解决方案6】:

      您似乎想抽象逻辑以处理第一个、最后一个以及以不同方式出现的任何事物。

      你可以通过定义一个解构类来做到这一点,如下所示:

      import java.util.*;
      
      abstract class EndsDestructurer<A, B> {
        public abstract B first(A a);
        public abstract B intermediate(A a);
        public abstract B last(A a);
      
        public List<B> apply(List<A> xs) {
          int i = 0;
          int lastIndex = xs.size() - 1;
          List<B> ys = new ArrayList<B>();
          for (A x : xs) {
            if (i == 0) ys.add(first(x));
            else if (i == lastIndex) ys.add(last(x));
            else ys.add(intermediate(x));
            i++;
          }
          return ys;
        }
      }
      

      用途:

      EndsDestructurer<Object, String> stringer = 
        new EndsDestructurer<Object, String>() {
          public String first(Object o) { return "first: " + o; }
          public String intermediate(Object o) { return "intermediate: " + o; }
          public String last(Object o) { return "last: " + o; }
        };
      
      List<Object> xs = Arrays.<Object>asList(90, "hello", 5.6, 12, "namaste", false);
      System.out.println(stringer.apply(xs));
      

      以上打印:
      [first: 90, intermediate: hello, intermediate: 5.6, intermediate: 12, intermediate: namaste, last: false].

      【讨论】:

        【解决方案7】:

        您的索引始终为 0 - myList.size() -1。我怀疑也许我不理解你的问题,因为这似乎是不言而喻的。

        【讨论】:

          【解决方案8】:

          在 C# .NET 世界中,我们有 ArrayList.UpperBound 或 ArrayList.LowerBound 在 Java 中是否有类似的东西?

          在 Java 世界中,任何可索引集合的第一个元素的偏移量始终为零,因此“下限”和“上限”方法将是多余的。

          只需使用常量0

          【讨论】:

          • 它们在 C# 中也是多余的,但提供它们是为了方便。
          • 实际上,通过阅读在线文档 (msdn.microsoft.com/en-us/library/…) ArrayList 根本没有 有这些方法。
          【解决方案9】:

          AFAIK,ArrayList 类没有这样的方法来给出它的对象的first and last element


          你可以写一些类似的代码,

          ArrayList<String> arr = new ArrayList<String>();
          int size = arr.size();
          if(size==0)
          {
              // no data
          }
          else if(size == 1)
          {
              // first = arr.get(0);
              // last = arr.get(0);
          }
          else
          {
              // first = arr.get(0);
              // last = arr.get(size-1);
          }
          

          【讨论】:

            猜你喜欢
            • 2017-12-27
            • 2023-03-09
            • 2018-08-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-03
            • 2016-02-22
            • 1970-01-01
            相关资源
            最近更新 更多