数组列表-如何检查索引是否存在?

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

我应该简单地 get()和检查值? 或者我应该等待一个异常? 还有别的办法吗?

更新: 谢谢你的回答,但是因为我只在特定的索引中添加内容,所以列表的长度不会显示哪些内容是可用的。

297836 次浏览

方法 arrayList.size() 报税表列表中的条目数-所以如果索引大于或等于 size(),它就不存在。

if(index >= myList.size() || index < 0){
//index does not exists
}else{
// index exists
}

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

如果要检查索引处的值是否为 null,请调用 get()

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

您可以检查数组的大小。

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

这就是你需要的。

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

为什么不使用一个普通的老数组? 我认为对 List 的索引访问是一种代码味道。

关于您的更新(这可能是另一个问题)。 您应该使用这些对象的数组来代替 ArrayList, 所以你可以简单的检查一下 null 的值:

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

最佳实践

如果你的数组中没有上百个条目,你应该考虑把它组织成一个类,去掉神奇的数字3、8等等。

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

虽然你得到了很多关于如何使用列表大小的建议,这些建议适用于线性条目的列表,但似乎没有人读过你的问题。

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

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

试试这个:

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

如果索引不存在,这里会添加一个新的条目。您可以修改它来做一些不同的事情。

快速测试索引是否存在。在您的实现替换列表与您的列表,您正在测试。

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

因为 Java9有一种检查索引是否属于数组的标准方法-对象 # 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

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

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

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

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

一个简单的方法:

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

这是为 科特林开发人员准备的:

if (index in myList.indices) {
// index is valid
}

其他解决方案:

// The rangeUntil operator (..<) is still exprimental in Kotlin 1.7.20
if (index in 0..<myList.size) {
// index is valid
}
if (index in 0 until myList.size) {
// index is valid
}
if (index in 0..myList.lastIndex) {
// index is valid
}
if (index >= 0 && index <= myList.lastIndex) {
// index is valid
}
// Note: elements of the list should be non-null
if (myList.getOrNull(index) != null) {
// index is valid
}
// Note: elements of the list should be non-null
myList.getOrNull(index)?.let { element ->
// index is valid; use the element
}
Scanner input = new Scanner(System.in);
System.out.println("Enter the index to check");
int i  = input.nextInt();
if (i > tasksList.size() || i < 0 ){
System.out.println("invalid input");
}else {
//your code
}