2016-09-04 9 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は生成する能力が必要です。それ以外の場合は、例の多くはindexOf' 'のための整数を使用している場合はそれを –

答えて

3

indexOfは、Wordのオブジェクトを比較しようとしています。あなたのリストにはidsが要素として含まれていないので、-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

この回答は今は効率的ですが、そのような場合にはJavaの内部実装を使用し、独自のコードを記述することは望ましくありません。将来的には変化する可能性があり、そのようなことはJavaライブラリに組み込まれています。また、異なる量のサブセットまたは長さに対して、異なるアルゴリズムを使用して、すべての場合において性能を最大化する。だから私は単語のオブジェクトを作成し、インデックスを見つけるためにindexOfメソッドで渡すことをお勧めします。これにより、よりクリーンでスケーラブルになります。 –

+0

@AnkitBhatnagar "独自のコードを書く"と "Java内部実装"が一致しません。線形検索アルゴリズムは簡単で十分であり、常に効率的なままであるので、「今すぐ」は適用されません。オブジェクトのすべての潜在的なフィールドに一致するものが1つの値である場合に、オブジェクトに対して定義された完全に実装されたequalsメソッドの必要性は見当たりません –

-1

リスト内のクラスは、動作するindexOf()を持つためにhascode()とequals()を実装する必要があります。

+0

を行う方法を他の場所があり、それはまだ私は整数としてIDを使用 –

+1

を動作しません..しかし、それはできませんIDというフィールドを持つ – sldroid

+0

動作しませんJavaはそれをIDとして使うべきだと推測します。また、そのidフィールドに基づいてhashcodeとequalsを実装する必要があります。eclipseでは、idフィールドを選択してソースをクリックし、ハッシュコードを生成し、フィールドを使用して等価することができます。 – YMomb

1
  1. "Word"オブジェクトにequalsメソッドを実装します。 equalsメソッドの中では、idフィールドにのみ等価を適用できます。

  2. は、そのIDで新しいWordオブジェクトを作成し、indexOfの中で、そのオブジェクトを渡します。 idをindexOfに渡さないでください。新しい既存のWordオブジェクトを必要なIDで渡します。

この場合、indexOfはこの単語オブジェクトの有効なインデックスを返します。リスト内のオブジェクトを検索するための

0

。 Wordクラスのequalsメソッドをオーバーライドする必要があります。さもなければ-1を得るでしょう。 indexOfは内部的にequalsメソッドを使用してlist内の要素を検索するためです。

関連する問題