13

晚上好,

我有一个 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”事件中。

4

9 回答 9

13

它总是建议使用IteratorsListIterator遍历列表。当您修改列表数据(删除或插入元素)时,使用列表大小作为参考不会锻炼。

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

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

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");
        }

    }

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

于 2012-06-07T05:39:10.787 回答
9
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
    }
}
于 2012-06-07T05:52:08.837 回答
2

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

lastElement = Iterables.getLast(iterableList);

并获得第一个元素:

firstElement = Iterables.getFirst(iterable, defaultValue)

有关 Java 集合的更多信息,请查看

于 2019-05-30T12:20:06.673 回答
1

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

于 2012-06-07T05:31:27.593 回答
1

ArrayLists 的底部索引始终为 0。因此if (index > 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();
}
于 2012-06-07T05:39:52.067 回答
1

看来您想抽象出处理第一个、最后一个以及以不同方式出现在两者之间的任何事物的逻辑。

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

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].

于 2012-06-07T06:21:13.040 回答
0

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

于 2012-06-07T05:39:29.620 回答
0

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);
}
于 2012-06-07T05:43:46.023 回答
0

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

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

只需使用常量0

于 2012-06-07T06:35:18.393 回答