ArrayList에서 항목의 인덱스를 찾는 더 좋은 방법은 무엇입니까?


90

Android 앱의 경우 다음 기능이 있습니다.

private ArrayList<String> _categories; // eg ["horses","camels"[,etc]]

private int getCategoryPos(String category) {
    for(int i = 0; i < this._categories.size(); ++i) {
        if(this._categories.get(i) == category) return i;
    }

    return -1;
}

이것이 요소의 위치를 ​​얻기위한 함수를 작성하는 "가장 좋은"방법입니까? 아니면 내가 활용해야 할 자바에 멋진 shmancy 네이티브 함수가 있습니까?


2
이 코드는 결함이있을 수 있습니다.를 사용 ==하면 대부분의 경우 잘못된 결과가 생성됩니다.

3
문자열을 '=='와 비교할 수 없다는 것을 기억하십시오. String.equals (String str)
MrZander

5
물론 @MrZander 당신은 그들을 비교할 수 있습니다 ==... 그냥 ;-) 비교의 오른쪽 종류하지

내가 아직 자바에 익숙하지 않다는 것을 알 수있다. 자바 스크립트와 같은 언어에있는 String.equals것과 더 비슷 할까 ===? 예. 값과 유형을 확인합니까?
Jacksonkr 2011

3
아니오 ==개체의 신원 과 수단 "동일한 목적으로한다" . (이 뷰는 값이 42 또는 char 'x'등인 숫자가 하나만 있다고 생각하는 경우 참조 유형뿐만 아니라 원시 값에 대해서도 적용됩니다.) Object.equalsA는 가상있어서 모든 객체 인스턴스를 정의하며 수단 "와 같은 값을 갖는다" 모든 클래스 개체 유형을 확장하고, 모든 표기로서 물체 동등 검사. Cover ==vs 에는 많은 질문 Object.equals이 있으며 이것은 이해해야 할 매우 중요한 개념입니다! 예를 들어, 이것은 거짓입니다 : "hello" == new String("hello")! 도!

답변:


194

ArrayList갖는 indexOf()방법 . 자세한 내용은 API를 확인하세요. 작동 방식은 다음과 같습니다.

private ArrayList<String> _categories; // Initialize all this stuff

private int getCategoryPos(String category) {
  return _categories.indexOf(category);
}

indexOf() 메서드가 반환하는 것을 정확하게 반환합니다.


3
더 효율적으로 구현 될 수 있지만 게시 된 코드보다 복잡성 측면에서 "빠르지"않습니다. 또한 indexOf는 여기서 약간 다르게 반응합니다. 원래 코드는 [잘못] 사용 ==하고 indexOf는를 사용합니다 equals().

실제로 null을 개별적으로 처리하는 if-else 분기로 시작한다는 점을 제외하면 거의 동일한 코드입니다 (적어도 내가 가지고있는 Sun Java 6 코드에서는).
yshavit 2011

이전 배열과 List <>에는 FindIndex () 메서드가 있지만 API는 ArrayList의 중간에 변경됩니다. : D
boctulus

16
ArrayList<String> alphabetList = new ArrayList<String>();
alphabetList.add("A"); // 0 index
alphabetList.add("B"); // 1 index
alphabetList.add("C"); // 2 index
alphabetList.add("D"); // 3 index
alphabetList.add("E"); // 4 index
alphabetList.add("F"); // 5 index
alphabetList.add("G"); // 6 index
alphabetList.add("H"); // 7 index
alphabetList.add("I"); // 8 index

int position = -1;
position = alphabetList.indexOf("H");
if (position == -1) {
    Log.e(TAG, "Object not found in List");
} else {
    Log.i(TAG, "" + position);
}

출력 : 목록 색인 : 7

H 를 전달하면 7 을 반환하고 J 를 전달하면 기본값을 -1 로 정의 했으므로 -1 을 반환 합니다.

끝난


내가 바이스 역이의를 만들 수있는 방법, 솔루션에 대한 귀하의 의견은 H 와 당신의 위치를 얻을 H가 내 입력의 색인 경우, 가정 7 전 해당 인덱스의 문자열 값을 얻을 수있는 방법. 감사합니다
Jimale Abdi 2019 년

1
@JimaleAbdi do yourArrayList.get (7). 7은 당신의 위치입니다.
Hiren Patel

6

List정렬되어 있고 임의 액세스가 좋은 경우 (그대로 ArrayList) Collections.binarySearch. 그렇지 않으면 List.indexOf다른 사람들이 지적한대로 를 사용해야합니다 .

그러나 당신의 알고리즘은 건전합니다 (다른 ==사람들이 지적한 것 외에 ).


3

자바에는 실제로 활용해야 할 멋진 shmancy 네이티브 함수가 있습니다.

ArrayList에는 다음과 같은 인스턴스 메서드가 있습니다.

indexOf(Object o)

(http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html)

_categories다음과 같이 호출 할 수 있습니다.

_categories.indexOf("camels")

저는 Android 프로그래밍 경험이 없지만 표준 Java 애플리케이션에서 작동합니다.

행운을 빕니다.


1
네이티브 함수는 나에게 C \ C ++를 의미합니다.
Hunter McMillen 2011

3

Java API는 사용할 수있는 두 가지 메소드 indexOf(Object obj), 및 lastIndexOf(Object obj). 첫 번째는 발견되면 요소의 색인을 반환하고 그렇지 않으면 -1을 반환합니다. 두 번째는 목록을 거꾸로 검색하는 것과 같은 마지막 색인을 반환합니다.


1

목록에서 항목의 위치를 ​​찾는 가장 좋은 방법은 컬렉션 인터페이스를 사용하는 것입니다.

예 :

List<Integer> sampleList = Arrays.asList(10,45,56,35,6,7);
Collections.binarySearch(sampleList, 56);

출력 : 2



0

여기에 최고의 솔루션

class Category(var Id: Int,var Name: String)
arrayList is Category list
val selectedPositon=arrayList.map { x->x.Id }.indexOf(Category_Id)
spinner_update_categories.setSelection(selectedPositon)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.