Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ArrayList查找第一个和最后一个元素_Java_Android - Fatal编程技术网

Java ArrayList查找第一个和最后一个元素

Java ArrayList查找第一个和最后一个元素,java,android,Java,Android,晚上好, 我有一个ArrayList(实例化为ld_数据),我向前和向后迭代,向用户显示元素数据。在这个过程中,我需要知道我何时处于第一个元素和最后一个元素。当我处于最后一个元素时进行检测: if((index + 1) <= ld_data.size()) { .... } 在C#.NET世界中,我们有ArrayList.UpperBound或ArrayList.LowerBound,Java中有类似的东西吗 JB 编辑:更多详细信息。因此,有关更多信息,我将绑定到ListVi

晚上好,

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

if((index + 1) <= ld_data.size())
{
    ....
}
在C#.NET世界中,我们有ArrayList.UpperBound或ArrayList.LowerBound,Java中有类似的东西吗

JB


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

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

始终建议使用
迭代器
列表迭代器
对列表进行迭代。当您修改列表数据(删除或插入元素)时,使用列表大小作为参考并不起作用

迭代器-允许调用方在一个方向上迭代列表,并在迭代过程中使用定义良好的语义从基础集合中删除元素

您可以使用
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");
        }

    }
ArrayList list=new ArrayList();
ListIterator迭代器=list.ListIterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
...
...
System.out.println(迭代器.previous());
如果(!iterator.hasPrevious()){
System.out.println(“在列表的开头”);
}如果(!iterator.hasNext()){
System.out.println(“列表末尾”);
}
}

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

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

ArrayList
s的底部索引始终为0。所以
如果(索引>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 i=ld_data.ListIterator();
if(i.hasNext()){
Item=i.next();
}
//及
if(i.hasPrevious()){
Item=i.previous();
}

AFAIK,
ArrayList
类没有这样的方法来给出它的对象的
第一个和最后一个元素


你可以写一些代码,比如

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);
}
ArrayList arr=new ArrayList();
int size=arr.size();
如果(大小==0)
{
//没有数据
}
否则如果(大小==1)
{
//first=arr.get(0);
//last=arr.get(0);
}
其他的
{
//first=arr.get(0);
//last=arr.get(尺寸-1);
}
List List=new ArrayList();
对于(int index=0;index
似乎您想要抽象出逻辑,以不同的方式处理第一个、最后一个以及介于两者之间的任何内容

您可以通过定义一个分解类来实现,如下所示:

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;
  }
}
import java.util.*;
抽象类EndsDestructurer{
公开摘要B第一(A);
公开摘要B中级(A);
公开摘要乙末(甲);
公共列表应用(列表xs){
int i=0;
int lastIndex=xs.size()-1;
List ys=新的ArrayList();
for(A x:xs){
如果(i==0)ys.加上(第一个(x));
如果(i==lastIndex)ys.add(last(x));
添加(中间体(x));
i++;
}
返回y;
}
}
使用:

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));
endsDestructurerStringer=
新的EndsDestructurer(){
第一个公共字符串(对象o){return“first:+o;}
公共字符串中间(对象o){return“intermediate:+o;}
公共字符串last(Object o){return“last:+o;}
};
List xs=Arrays.asList(90,“hello”,5.6,12,“namaste”,false);
System.out.println(stringer.apply(xs));
以上打印:
[第一:90,中间:你好,中间:5.6,中间:12,中间:namaste,最后:false]

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

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


只需使用常量
0

我建议您使用它。如果列表为空,则
getLast
方法将抛出
NoTouchElementException

lastElement = Iterables.getLast(iterableList);
要获得第一个元素:

firstElement = Iterables.getFirst(iterable, defaultValue)

有关Java集合的更多信息,请参见。

您确定吗?通过我对文档的阅读,C#Array类有这些方法,但C#ArrayList没有。-1错误:如果大小为0,则第一个元素将为零,并且将找不到最后一个元素,因此不需要for循环。@fastekerins:如果大小为0,则
索引您是对的,很抱歉我错过了“我也喜欢你的想法。这样,您将拥有对第一个和最后一个元素的引用。我之所以使用循环,是因为OP似乎就是这么做的。它们在C#中也是多余的,但它们是为了方便而提供的。实际上,通过我对在线文档()的阅读,ArrayList根本没有这些方法。我不确定是否遵循了这个方法。indexOf(Object)是我看到的唯一与索引相关的方法
lastElement = Iterables.getLast(iterableList);
firstElement = Iterables.getFirst(iterable, defaultValue)