晚安,
我有一个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”事件中。
答案 0 :(得分:12)
始终建议使用Iterators
或ListIterator
来遍历列表。在修改列表数据(删除或插入元素)时,使用列表大小作为参考不会进行锻炼。
迭代器 - 允许调用者在一个方向上遍历列表,并在迭代期间使用明确定义的语义从基础集合中删除元素
您可以使用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
用法的示例,请分析您的要求并按要求实施。
答案 1 :(得分: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
}
}
答案 2 :(得分:1)
检查索引是否等于0.第一个元素始终位于此索引中。
答案 3 :(得分:1)
ArrayList
的底部索引始终为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();
}
答案 4 :(得分: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]
。
答案 5 :(得分:1)
我建议您使用Google Guava。如果列表为空,则getLast
方法将抛出NoSuchElementException
:
lastElement = Iterables.getLast(iterableList);
并获得第一个元素:
firstElement = Iterables.getFirst(iterable, defaultValue)
有关Java集合的更多信息,check it out。
答案 6 :(得分:0)
您的索引始终为0 - myList.size() - 1。我怀疑也许我不理解你的问题,因为这似乎是不言而喻的。
答案 7 :(得分: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);
}
答案 8 :(得分:0)
在C#.NET世界中,我们有ArrayList.UpperBound或ArrayList.LowerBound是否有类似Java的东西?
在Java世界中,任何可索引集合的第一个元素总是偏移为零,因此“下限”和“上限”方法将是多余的。
只需使用常量0
。