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

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

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

Обновление

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

Ответы [ 11 ]

131 голосов
/ 25 января 2010

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

if(index >= myList.size()){
  //index not exists
}else{
 // index exists
}
65 голосов
/ 22 ноября 2011

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

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

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

Попробуйте это:

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

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

12 голосов
/ 25 января 2010

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

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

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

6 голосов
/ 25 января 2010

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

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

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

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

Поток управления с использованием исключения является плохой практикой.

5 голосов
/ 14 января 2018

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

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

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

if (index >= 0 && index < list.size()) {
    ...
}
3 голосов
/ 25 февраля 2017

Поскольку 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
3 голосов
/ 25 января 2010

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

1 голос
/ 21 апреля 2013

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

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;
}
0 голосов
/ 06 июня 2018

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

try {
  list.get( index ); 
} 
catch ( IndexOutOfBoundsException e ) {
  if(list.isEmpty() || index >= list.size()){
    // Adding new item to list.
  }
}
0 голосов
/ 25 января 2010

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

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'
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...