ArrayList Найти первый и последний элемент
Добрый вечер,
У меня есть ArrayList (созданный как ld_data), и я перебираю вперед и назад поиск/отображение пользователю данных элемента. В этом процессе мне нужно знать, когда я нахожусь в первом элементе и в последнем. Обнаружение, когда я нахожусь в последнем элементе, я делаю как таковой:
if((index + 1) <= ld_data.size())
{
....
}
Это работает, потому что свойство size также является верхней границей ArrayList. Однако обнаружение, когда я нахожусь в первом элементе, не так просто для меня. Лучшее, что мне удалось выяснить, это то, что кажется довольно хромым... но оно работает.
if((index - 1) >= (ld_data.size() - ld_data.size()))
{
....
}
В мире С#.NET у нас есть ArrayList.UpperBound или ArrayList.LowerBound есть что-то похожее в Java?
JB
EDIT: дальнейшие подробности. Поэтому для получения дополнительной информации я привязан к ListView. Поэтому, когда пользователь прокручивается до первого элемента списка, я хочу показать msg "В начале списка" и когда они дойдут до конца "Конец списка". Я знаю, что есть полоса прокрутки, которая делает это очевидным, я просто пытаюсь привести пример того, что я делаю. Таким образом, эта проверка происходит в событии OnScroll.
Ответы
Ответ 1
Всегда рекомендуется использовать Iterators
или ListIterator
для перебора по списку. Использование размера списка в качестве ссылки не работает, когда вы изменяете данные списка (удаление или вставка элементов).
Итератор - позволяет вызывающему итератору перебирать список в одном направлении и удалять элементы из базовой коллекции во время итерации с четко определенной семантикой
Вы можете использовать ListIterator
для итерации по списку. A 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
}
}
Ответ 3
Просто проверьте, равен ли индекс 0. Первый элемент всегда находится в этом индексе.
Ответ 4
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();
}
Ответ 5
Похоже, вы хотите отвлечься от логики, чтобы иметь дело с первым, последним и тем, что происходит между ними по-разному.
Вы можете сделать это, указав класс деструктуризации, как показано ниже:
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]
.
Ответ 6
Ваш индекс всегда будет 0 - myList.size() -1. Я подозреваю, может быть, я не понимаю ваш вопрос, потому что это кажется очевидным.
Ответ 7
Класс 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
В мире С#.NET у нас есть ArrayList.UpperBound или ArrayList.LowerBound есть что-то похожее в Java?
В мире Java первый элемент любой индексируемой коллекции всегда имеет смещение нуля, поэтому методы с "нижней границей" и "сверху" будут избыточными.
Просто используйте константу 0
.