2016-09-04 4 views
-4

다음 메서드를 사용하여 ArrayList에 데이터를 추가했습니다. (가) 일부 데이터를 추가 한 후ArrayList에서 요소의 위치를 ​​얻는 방법

ArrayList<Word> wordList = new ArrayList<Word>(); 
Word word = new Word(); 
word.set_id(id); 
word.setWord(word); 
word.setDefinition(definition); 
wordList.add(word); 

, 나는 내가 ArrayList를 찾을 원하는 모든 ID의 위치를 ​​찾을합니다.

이미 id로 위치를 얻으려면 다음 방법을 시도해 보았습니다. 그러나 그것은 효과가 없습니다.

int position = wordList.indexOf(id); 

두 코드는 항상 생성
int position = wordList.lastIndexOf(id); 

"위치 = -1"이 결과. 어떻게해야합니까?

편집

이는 Word.java 클래스의 코드입니다. 어떻게 동등한 방법을 구현할 수 있습니까?

public class Word { 
    private String _id, word, definition, favourite, usage; 

    public String get_id() { 
     return _id; 
    } 

    public void set_id(String _id) { 
     this._id = _id; 
    } 

    public String getWord() { 
     return word; 
    } 

    public void setWord(String word) { 
     this.word = word; 
    } 

    public String getDefinition() { 
     return definition; 
    } 

    public void setDefinition(String definition) { 
     this.definition = definition; 
    } 

    public String getFavourite() { 
     return favourite; 
    } 

    public void setFavourite(String favourite) { 
     this.favourite = favourite; 
    } 

    public String getUsage() { 
     return usage; 
    } 

    public void setUsage(String usage) { 
     this.usage = usage; 
    } 
} 
+0

개체에 액세스 할 수있는 경우 indexOf를 사용하여 개체를 검색하십시오. –

+0

가능한 [Java - 배열의 요소 위치 가져 오기] (http://stackoverflow.com/questions/7581363/java-get-element-position-in) -array) –

+0

"어떻게 equals 메소드를 구현할 수 있습니까?"- 필요는 없지만 IDE는이를 생성 할 수 있어야합니다. 그렇지 않다면 다른 곳에서 예제가 많이 있습니다. –

답변

3

indexOf Word 개체를 비교하려고합니다. 목록에 요소로 ID가 포함되어 있지 않으므로 -1을 얻습니다.

루프를 사용하여 목록을 검색해야합니다.

int id = 3; 
int position = -1; 
for (int i = 0; i < wordlist.size(); i++) { 
    if (wordlist.get(i).getId() == id) { 
     position = i; 
     // break; // uncomment to get the first instance 
    } 
} 

참고 : 전체 목록을 검색하여 해당 ID의 마지막 색인을 찾습니다. 그래서 중복이 있고 첫 번째 것을 원할 경우 (또는 원하는 것을 찾자 마자 루프를 멈추기 위해) if 문에 break을 추가하십시오.

+0

대단히 감사합니다. 위의 코드를 AsyncTask 클래스에서 사용했습니다. 그것은 일하는 매력입니다. – sldroid

+0

이 답변은 지금 당장은 효율적이지만, 자바 내부 구현을 사용하고 자신의 코드를 작성하지 않는 것이 바람직합니다. 미래에는 상황이 바뀔 수 있으며 이러한 것들은 자바 라이브러리에서 가르칩니다. 또한 서브 세트 또는 길이의 다른 양에 대해, 상이한 알고리즘이 모든 경우에서 성능을 최대화하기 위해 사용된다. 그래서 단어 개체를 만들고 인덱스를 찾기 위해 indexOf 메서드에 전달하는 것이 좋습니다. 이렇게하면 더 깔끔하고 확장 가능해질 것입니다. –

+0

@AnkitBhatnagar "자신의 코드 작성"이 "Java 내부 구현"과 일치하지 않습니다. 선형 검색 알고리즘은 간단하고 항상 효율적이므로 "지금 당장"은 적용되지 않습니다. 모든 객체를 찾을 때 객체에 대해 정의 된 완전히 구현 된 equals 메소드가 필요하지 않습니다. 객체의 모든 잠재적 필드와 일치하지 않는 한 값일 때만 나타납니다. –

-1

목록의 클래스는 작동하는 indexOf()를 갖기 위해 hascode()와 equals()를 구현해야합니다.

+0

'indexOf'에 정수를 사용하면 여전히 작동하지 않습니다. –

+1

id를 정수로 사용했지만 작동하지 않습니다. – sldroid

+0

id라는 필드를 사용하면 Java는 ID로 사용해야한다고 추측합니다. 또한 id 코드를 기반으로 hashcode와 equals를 구현해야합니다.이클립스에서 id 필드를 선택하고 소스를 클릭하고 해시 코드를 생성 한 다음 필드를 사용하여 같음 – YMomb

1
  1. "Word"개체에 equals 메서드를 구현합니다. equals 메서드 내에서 id 필드에만 동일하게 적용 할 수 있습니다.

  2. 해당 ID를 사용하여 새 Word 개체를 만들고 해당 개체를 indexOf에 전달하십시오. id를 indexOf에 전달하지 마십시오. 필요한 기존 ID를 가진 기존 Word 개체를 전달하십시오.

그런 다음 indexOf는이 word 개체의 유효한 인덱스를 반환합니다.

0

목록에서 개체를 검색하는 경우. Word 클래스에서 equals 메서드를 재정의해야합니다. 그렇지 않으면 -1이됩니다. indexOf가 내부적으로 equals 메서드를 사용하여 list의 요소를 검색하기 때문입니다.

관련 문제