java:ArrayList-如何检查索引是否存在?
我正在使用java:ArrayList-如何检查索引是否存在?,java,arraylist,Java,Arraylist,我正在使用ArrayList并在特定索引处添加数据,如何检查特定索引是否存在 我应该简单地get()并检查值吗?或者我应该等待一个例外? 还有别的办法吗 更新 感谢您的回答,但因为我只是在特定索引中添加内容,列表的长度不会显示可用的内容。方法arrayList.size()列表中的项目数-因此,如果索引大于或等于size(),它就不存在 if(index >= myList.size()){ //index not exists }else{ // index exists } 如
ArrayList
并在特定索引处添加数据,如何检查特定索引是否存在
我应该简单地get()
并检查值吗?或者我应该等待一个例外?
还有别的办法吗
更新
感谢您的回答,但因为我只是在特定索引中添加内容,列表的长度不会显示可用的内容。方法
arrayList.size()
列表中的项目数-因此,如果索引大于或等于size()
,它就不存在
if(index >= myList.size()){
//index not exists
}else{
// index exists
}
如果索引小于列表的大小,则它确实存在,可能具有
null
值。如果索引较大,则可以调用ensureCapacity()
以使用该索引
如果要检查索引中的值是否为空,请调用
get()
您可以使用size()
方法检查数组列表的大小。这将返回可以检查数组大小的最大索引+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();
}
public boolean indexists(最终列表,最终整数索引){
返回索引>=0&&index
为什么不使用普通的旧数组?我认为,对列表的索引访问是一种代码气味。关于您的更新(这可能是另一个问题)。
您应该使用这些对象的数组,而不是ArrayList,
因此,您可以简单地检查空值:
Object[] array = new Object[MAX_ENTRIES];
..
if ( array[ 8 ] == null ) {
// not available
}
else {
// do something
}
最佳做法
如果你的数组中没有几百个条目,你应该考虑把它组织成一个类来去掉魔法数,3,8等等。
使用异常控制流是一种糟糕的做法。当您收到十几条关于使用列表大小的建议时,这些建议适用于具有线性条目的列表,但似乎没有人阅读您的问题
如果您在不同的索引中手动添加条目,这些建议都不起作用,因为您需要检查特定的索引
使用if(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 hasIndex(int-index){
如果(索引
或者对于二维数组列表
public boolean hasRow(int row){
if(row < _matrix.size())
return true;
return false;
}
public boolean hasRow(int行){
如果(行<_矩阵大小())
返回true;
返回false;
}
由于java-9
有一种检查索引是否属于数组的标准方法-:
List 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(索引
如果您还担心索引为负值,请使用以下命令
if (index >= 0 && index < list.size()) {
...
}
if(索引>=0&&index
一种简单的方法:
try {
list.get( index );
}
catch ( IndexOutOfBoundsException e ) {
if(list.isEmpty() || index >= list.size()){
// Adding new item to list.
}
}
看一看集合,也许它更适合您的需要?然后您必须get()
并检查null
——但不要依赖异常。考虑使用<代码>哈希表< /代码>而不是可怕的!!我将使用HashTable thanks,它应该“大于或等于size()
”,因为它是一个基于零的索引。同样值得一提的是,要使这个原子化,您可能需要执行size()命令锁定列表时,检查和相应的基于条件索引的查找。请注意,我将此答案标记为正确答案是因为所有者(Amarghosh)在对我的问题的评论中回答了我的问题。哈希表将更好地满足我的需要。如果您在arraylist中使用项目ID设置项目,该怎么办?例如,mylist.set(1,第1项);mylist.set(3,第3项)//跳过2我想HashMap更适合那个场景?这让我不太满意。。如果我想在索引已经存在的情况下执行列表中的某项操作,但如果不这样做,则准备它。。对于一个新列表,我将从index=0
和我的list.size()==0
开始。所以,我第一次检查它是否正确&我会准备清单来做一些事情。但是下一次在该索引处,我的索引仍然是index=0
,现在我正在重新初始化列表中的元素,当时我应该在做一些事情。第一个想法是&
第二个条件,如列表。get(index)=null
,但这不起作用,这就是为什么会有这样的问题调用ensureCapacity(int)不会增加列表的大小,只会增加容量;i、 例如,“潜在大小”,所以越界索引查找仍然会失败。另外,为什么要调用ensureCapacity(int)?例如,如果列表的当前大小为5,并且您想要确定项#:100000000的值,那么这可能是一个非常昂贵的操作。我的意思是,小于size()的索引始终存在,大于等于size()的索引不存在,并且在列表变得足够大之前,不能使用它们(=调用集()。仅仅调用ensureCapacity是不够的事实上,我们需要通过添加元素来更改大小。关于ensureCapacity(int)实际作用的错误解释。它与ArrayList大小无关。不总是这样,因为他可能希望ArrayList随着时间的推移而增长,而数组不能这样做。谢谢你,需要使用这种技术来单元测试数组索引是否存在。记住避免使用try/catch
进行此类工作,这将使你的程序速度降低50%甚至更多。。错误检查会像一条带子一样添加到现有代码中,以降低其速度。。最好在关键区域避免。在这种情况下,检查length
是最好的选择,因为try {
list.get( index );
}
catch ( IndexOutOfBoundsException e ) {
if(list.isEmpty() || index >= list.size()){
// Adding new item to list.
}
}