Ответ 1
Метод arrayList.size()
возвращает количество элементов в списке - поэтому, если индекс больше или равен size()
, он не существует.
if(index >= myList.size()){
//index not exists
}else{
// index exists
}
Я использую ArrayList<String>
, и я добавляю данные по определенным индексам,
как я могу проверить, существует ли какой-либо конкретный индекс?
Должен ли я просто get()
и проверить значение? Или я должен ждать исключения?
Есть ли другой способ?
Спасибо за ваши ответы, но поскольку я только добавляю материал по определенным индексам, длина списка не покажет мне, какие из них доступны.
Метод arrayList.size()
возвращает количество элементов в списке - поэтому, если индекс больше или равен size()
, он не существует.
if(index >= myList.size()){
//index not exists
}else{
// index exists
}
Пока у вас есть дюжина предложений об использовании размера вашего списка, который работает для списков с линейными записями, никто, казалось, не читал ваш вопрос.
Если вы добавляете записи вручную в разных индексах, ни одно из этих предложений не будет работать, так как вам нужно проверить определенный индекс.
Использование if (list.get(index) == null) также не будет работать, поскольку get() генерирует исключение вместо возврата null.
Попробуйте следующее:
try {
list.get( index );
} catch ( IndexOutOfBoundsException e ) {
list.add( index, new Object() );
}
Здесь добавляется новая запись, если индекс не существует. Вы можете изменить его, чтобы сделать что-то другое.
Это то, что вам нужно...
public boolean indexExists(final List list, final int index) {
return index >= 0 && index < list.size();
}
Почему бы не использовать простой старый массив? Я считаю, что индексированный доступ к списку - это запах кода.
Относительно вашего обновления (что, вероятно, должно быть другим вопросом). Вы должны использовать массив этих объектов вместо ArrayList, поэтому вы можете просто проверить значение для null:
Object[] array = new Object[MAX_ENTRIES];
..
if ( array[ 8 ] == null ) {
// not available
}
else {
// do something
}
Лучшая практика
Если у вас нет сотни записей в вашем массиве, вы должны рассмотреть возможность организации его как класса, чтобы избавиться от магических чисел 3,8 и т.д.
Управляющий поток с использованием исключения - это плохая практика.
Обычно я просто проверяю, меньше ли индекс размера массива
if (index < list.size()) {
...
}
Если вы также обеспокоены тем, что индекс является отрицательным значением, используйте следующие
if (index >= 0 && index < list.size()) {
...
}
Вы можете проверить размер ArrayList
с помощью метода size()
. Это вернет максимальный индекс +1
Начиная с 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
Быстрый и грязный тест на наличие индекса или нет. в вашей реализации замените список. В списке, который вы тестируете.
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;
}
Если ваш индекс меньше размера вашего списка, он существует, возможно, с null
значением. Если индекс больше, вы можете вызвать ensureCapacity()
, чтобы иметь возможность использовать этот индекс.
Если вы хотите проверить, есть ли значение в вашем индексе null
или нет, вызовите get()
Вы можете проверить размер массива.
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'
}
}
простой способ сделать это:
try {
list.get( index );
}
catch ( IndexOutOfBoundsException e ) {
if(list.isEmpty() || index >= list.size()){
// Adding new item to list.
}
}