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.