java : ArrayList-인덱스가 있는지 어떻게 확인할 수 있습니까?


111

사용 ArrayList<String>중이며 특정 인덱스에 데이터를 추가합니다. 특정 인덱스가 있는지 어떻게 확인할 수 있습니까?

간단하게 get()값을 확인 해야합니까 ? 아니면 예외를 기다려야합니까? 다른 방법이 있습니까?

최신 정보

답변 해주셔서 감사합니다.하지만 특정 지수에만 항목을 추가하고 있기 때문에 목록의 길이가 사용 가능한 항목을 표시하지 않습니다.


2
당신이 필요로하는 것에 더 적합한 세트를 보셨나요?
Paul Whelan

3
그런 다음 get()확인 null해야합니다. 예외에 의존하지 마세요. 사용을 고려 HashTable하는 대신 java.sun.com/j2se/1.4.2/docs/api/java/util/Hashtable.html
Amarghosh

대박!! HashTable을 사용할 것입니다. 감사합니다
ufk

답변:


158

이 메서드 arrayList.size() 목록의 항목 수를 반환 하므로 인덱스가보다 크거나 같으면 size()존재하지 않습니다.

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

10
size()0부터 시작하는 인덱스이므로 "크거나 같음"이어야합니다 .
McDowell

1
또한이 원 자성을 만들려면 목록을 잠그는 동안 size () 검사 및 해당 조건부 색인 기반 조회를 수행해야합니다.
Adamski

3
이 답변을 정답에 표시하는 것은 소유자 (Amarghosh)가 내 질문에 대한 의견에서 내 질문에 답변했기 때문입니다. HashTable은 내 요구를 훨씬 더 잘 충족시킬 것입니다.
ufk

항목의 ID로 arraylist의 항목을 설정하는 경우 어떻게됩니까? 전의. mylist.set (1, item1); mylist.set (3, item3); // skipping 2 HashMap이 해당 시나리오에 더 적합하다고 생각합니까?
yeahman

이 인덱스가 이미있는 경우 나는이 목록에 뭔가를하려는 경우 매우 .. 나에게 만족하지 않지만, 그렇지 않으면 내가 시작하는거야 새로운 목록 .. 그 수험을 index = 0내와 list.size() == 0도. 그래서 처음으로 확인하면 사실이 될 것이며 목록을 준비하여 작업을 수행 할 것입니다. 그러나 다음에 해당 인덱스에서 내 인덱스는 그대로 유지 index = 0되며 이제 작업을 수행해야 할 때 목록에서 해당 요소를 다시 초기화합니다. 첫 번째 생각은 &&같은 두 번째 조건 에 대한 list.get(index) == null것이지만 작동하지 않는
것이이

69

선형 항목이있는 목록에서 작동하는 목록 크기 사용에 대한 12 가지 제안을 받았지만 아무도 귀하의 질문을 읽지 않은 것 같습니다.

다른 색인에 항목을 수동으로 추가하면 특정 색인을 확인해야하므로 이러한 제안이 작동하지 않습니다.

사용 (list.get (인덱스) == NULL) 경우 중 하나가 작동하지 않습니다) (GET으로하는 대신에 널 (null)을 반환의 예외가 발생합니다.

이 시도:

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

여기에 색인이 없으면 새 항목이 추가됩니다. 다른 작업을 수행하도록 변경할 수 있습니다.


2
감사합니다. 배열 인덱스가 있는지 여부를 단위 테스트하는 데이 기술이 필요했습니다.
물 자체

11
try/catch이런 종류의 작업에는 사용하지 마십시오. 프로그램 속도가 50 % 이상 느려질 수 있습니다. 오류 검사는 기존 코드에 스트랩처럼 추가하여 속도를 늦 춥니 다. 중요한 영역에서는 피하는 것이 좋습니다. 점검 length이 경우하면 이후, 당신이 할 수있는 최선의 일이 index항상 적은 다음이 될 것입니다 length, 기존 index의이 이동 얻을 것이다 새로운 될 index'당신이 경우에요 remove그들을 그러니에 대한 규칙 검사 왜 length항상 작동합니다.
SSpoke

1
@SSpoke ... 동의하지만 try / catch는 '좋은'대답과는 거리가 멀습니다. 목록이 드문 경우 문제를 해결합니다. 나는 배열을 사용하는 것을 선호한다 : Object [] ary; 아래 또는 해시.
의지

12

이것이 필요한 것입니다 ...

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

평범한 오래된 배열을 사용하지 않는 이유는 무엇입니까? 목록에 대한 색인화 된 액세스는 제 생각에 코드 냄새입니다.


3
항상 그런 것은 아닙니다. 그는 ArrayList가 시간이 지남에 따라 커지기를 원할 수 있으며 배열은 할 수 없습니다.
Coyote21 2011

7

일반적으로 인덱스가 배열 크기보다 작은 지 확인합니다.

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

인덱스가 음수 값이 아닌지 염려되는 경우 다음을 사용하십시오.

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

1
이것은 몇 년 전에 받아 들여진 답변 보다 어떤 가치를 제공 합니까?
Basil Bourque

2
나는 당신의 견해로는 그것이 어떤 가치도 제공하지 않는다고 생각하지만, 그가 받아 들인 대답을 완전히 이해하지 못했다고 가정하고 받아 들인 대답에 대한 로베르토 토마스의 의견을 보았습니다. "새 목록으로 index = 0에서 시작하고 list.size () == 0으로 시작할 것입니다. 처음으로 확인하면 사실이 될 것입니다."도움을 위해 별도의 답변을 게시하기로 결정했습니다. 미래의 혼란.
AamirR

6

업데이트와 관련하여 (아마도 다른 질문이 될 것입니다). ArrayList 대신 이러한 개체의 배열을 사용해야하므로 null 값을 간단히 확인할 수 있습니다.

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

모범 사례

배열에 수백 개의 항목이 없으면 매직 넘버 3,8 등을 제거하기 위해 클래스로 구성하는 것을 고려해야합니다.

예외를 사용한 제어 흐름은 나쁜 습관입니다.


1
array [8]이 없으면 ArrayIndexOutOfBoundException이 발생합니다.
Nitesh Kumar Anand


3

방법을 ArrayList사용하여의 크기를 확인할 수 있습니다 size(). 최대 인덱스 +1을 반환합니다.


2

이를 수행하는 간단한 방법 :

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

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

1
목록 .length에는 list.size()없지만 컴파일러에 의존하여 항상 이런 식으로 망쳐 놓는 것은 큰 문제가 아닙니다. 당신은 아마 원시적 배열 생각했다
SSpoke

1
잡아 주셔서 감사합니다. 컨테이너 카디널리티는 잊기 쉽습니다.
t3dodson 2014

0

색인이 목록의 크기보다 작 으면 null값이 있을 수 있습니다 . 인덱스가 더 크면 전화 할 수 있습니다.ensureCapacity() 해당 인덱스를 사용할 수 있도록 할 수 있습니다.

인덱스의 값이 맞는지 확인하려면 다음을 null호출하십시오.get()


1
ensureCapacity (int)를 호출하면 목록의 크기가 증가하지 않고 용량 만 증가합니다. 즉 "잠재적 크기"이므로 범위를 벗어난 인덱스 조회는 여전히 실패합니다.
Adamski

또한, 왜 ensureCapacity (int)를 호출합니까? 예를 들어 목록의 현재 크기가 5이고 항목 번호 : 100,000,000의 값을 확인하려는 경우 매우 비용이 많이 드는 작업이 될 수 있습니다.
Adamski

나는 size ()보다 작은 인덱스는 항상 존재하고> = size () 인 인덱스는 존재하지 않으며 목록이 충분히 커질 때까지 사용할 수 없다는 것을 의미했습니다 (== call set ()). ensureCapacity를 호출하는 것만으로는 충분하지 않습니다. 요소를 추가하여 크기를 변경해야합니다.
Dmitry

ensureCapacity (int)가 실제로 수행하는 작업에 대한 잘못된 설명입니다. ArrayList 크기에는 아무것도하지 않습니다.
Mohsen 2012

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'
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.