java:ArrayList - 如何检查索引是否存在?

时间:2010-01-25 11:10:40

标签: java arraylist

我正在使用ArrayList<String>并在特定索引处添加数据, 如何检查特定索引是否存在?

我应该只是get()并检查价值吗?或者我应该等待例外? 还有另一种方式吗?

更新

感谢您的回答,但由于我只是在特定索引处添加内容,因此列表的长度不会显示可用的内容。

11 个答案:

答案 0 :(得分:127)

方法arrayList.size() returns列表中的项目数 - 因此,如果索引大于或等于size(),则它不存在。

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

答案 1 :(得分:64)

虽然你有十几条关于使用列表大小的建议,这些建议适用于带有线性条目的列表,但似乎没有人能够阅读你的问题。

如果您在不同的索引处手动添加条目,这些建议都不起作用,因为您需要检查特定的索引。

使用 if(list.get(index)== null)也不会起作用,因为get()会抛出异常而不是返回null。

试试这个:

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

如果索引不存在,则添加新条目。你可以改变它来做一些不同的事情。

答案 2 :(得分:12)

这就是你需要的......

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

为什么不使用普通的旧阵列?我认为对List的索引访问是一种代码味道。

答案 3 :(得分:6)

关于您的更新(可能应该是另一个问题)。 您应该使用这些对象的数组而不是ArrayList, 所以你只需检查null的值:

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

最佳实践

如果阵列中没有数百个条目,你应该考虑将它组织成一个类来摆脱神奇的数字3,8等。

使用异常控制流是不好的做法。

答案 4 :(得分:5)

通常我只检查索引是否小于数组大小

    function wd_hierarchical_tags_register() {

    $labels = array(
        'name'                       => 'Items',
        'singular_name'              => 'Item',
        'menu_name'                  => 'Item',
        'all_items'                  => 'All Items',
        'parent_item'                => 'Parent Item',
        'parent_item_colon'          => 'Parent Item:',
        'new_item_name'              => 'New Item Name',
        'add_new_item'               => 'Add New Item',
        'edit_item'                  => 'Edit Item',
        'update_item'                => 'Update Item',
        'separate_items_with_commas' => 'Separate Item with commas',
        'search_items'               => 'Search Items',
        'add_or_remove_items'        => 'Add or remove Items',
        'choose_from_most_used'      => 'Choose from the most used Items',
    );

  register_taxonomy( 'product_tag', 'product', array(
        'labels'                     => $labels,
        'hierarchical'               => true,
  ) );

}
add_action('init', 'wd_hierarchical_tags_register');

如果您还担心索引为负值,请使用以下

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

答案 5 :(得分:3)

您可以使用ArrayList方法检查size()的尺寸。这将返回最大索引+1

答案 6 :(得分:3)

由于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

答案 7 :(得分:1)

是否存在索引的快速和脏测试。在您的实现替换列表中使用您正在测试的列表。

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

或2Dimensional ArrayLists ...

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

答案 8 :(得分:0)

如果您的索引小于列表的大小,则它确实存在,可能具有null值。如果index更大,那么您可以调用ensureCapacity()来使用该索引。

如果您想检查索引处的值是否为null,请致电get()

答案 9 :(得分:0)

您可以检查数组的大小。

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'
    }
}

答案 10 :(得分:0)

一种简单的方法:

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