Java: ArrayList - как я могу проверить, существует ли индекс?

Я использую ArrayList<String>, и я добавляю данные по определенным индексам, как я могу проверить, существует ли какой-либо конкретный индекс?

Должен ли я просто get() и проверить значение? Или я должен ждать исключения? Есть ли другой способ?

Update

Спасибо за ваши ответы, но поскольку я только добавляю материал по определенным индексам, длина списка не покажет мне, какие из них доступны.

Ответ 1

Метод arrayList.size() возвращает количество элементов в списке - поэтому, если индекс больше или равен size(), он не существует.

if(index >= myList.size()){
  //index not exists
}else{
 // index exists
}

Ответ 2

Пока у вас есть дюжина предложений об использовании размера вашего списка, который работает для списков с линейными записями, никто, казалось, не читал ваш вопрос.

Если вы добавляете записи вручную в разных индексах, ни одно из этих предложений не будет работать, так как вам нужно проверить определенный индекс.

Использование if (list.get(index) == null) также не будет работать, поскольку get() генерирует исключение вместо возврата null.

Попробуйте следующее:

try {
    list.get( index );
} catch ( IndexOutOfBoundsException e ) {
    list.add( index, new Object() );
}

Здесь добавляется новая запись, если индекс не существует. Вы можете изменить его, чтобы сделать что-то другое.

Ответ 3

Это то, что вам нужно...

public boolean indexExists(final List list, final int index) {
    return index >= 0 && index < list.size();
}

Почему бы не использовать простой старый массив? Я считаю, что индексированный доступ к списку - это запах кода.

Ответ 4

Относительно вашего обновления (что, вероятно, должно быть другим вопросом). Вы должны использовать массив этих объектов вместо ArrayList, поэтому вы можете просто проверить значение для null:

Object[] array = new Object[MAX_ENTRIES];
..
if ( array[ 8 ] == null ) {
   // not available
}
else {
   // do something
}

Лучшая практика

Если у вас нет сотни записей в вашем массиве, вы должны рассмотреть возможность организации его как класса, чтобы избавиться от магических чисел 3,8 и т.д.

Управляющий поток с использованием исключения - это плохая практика.

Ответ 5

Обычно я просто проверяю, меньше ли индекс размера массива

if (index < list.size()) {
    ...
}

Если вы также обеспокоены тем, что индекс является отрицательным значением, используйте следующие

if (index >= 0 && index < list.size()) {
    ...
}

Ответ 6

Вы можете проверить размер ArrayList с помощью метода size(). Это вернет максимальный индекс +1

Ответ 7

Начиная с java-9 существует стандартный способ проверки, принадлежит ли индекс к массиву - Objects # checkIndex():

List<Integer> ints = List.of(1,2,3);
System.out.println(Objects.checkIndex(1,ints.size())); // 1
System.out.println(Objects.checkIndex(10,ints.size())); //IndexOutOfBoundsException

Ответ 8

Быстрый и грязный тест на наличие индекса или нет. в вашей реализации замените список. В списке, который вы тестируете.

public boolean hasIndex(int index){
    if(index < list.size())
        return true;
    return false;
}

или для двумерных массивов...

public boolean hasRow(int row){
    if(row < _matrix.size())
        return true;
    return false;
}

Ответ 9

Если ваш индекс меньше размера вашего списка, он существует, возможно, с null значением. Если индекс больше, вы можете вызвать ensureCapacity(), чтобы иметь возможность использовать этот индекс.

Если вы хотите проверить, есть ли значение в вашем индексе null или нет, вызовите get()

Ответ 10

Вы можете проверить размер массива.

package sojava;
import java.util.ArrayList;

public class Main {
    public static Object get(ArrayList list, int index) {
        if (list.size() > index) { return list.get(index); }
        return null;
    }

    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add(""); list.add(""); list.add("");        
        System.out.println(get(list, 4));
        // prints 'null'
    }
}

Ответ 11

простой способ сделать это:

try {
  list.get( index ); 
} 
catch ( IndexOutOfBoundsException e ) {
  if(list.isEmpty() || index >= list.size()){
    // Adding new item to list.
  }
}