web-dev-qa-db-ja.com

Java ArrayList <String>に含むの使用

Javaのようなクラスの一部を形成する文字列のArrayListがある場合:

private ArrayList<String> rssFeedURLs;

上記のArrayListを含むクラスでメソッドを使用し、ArrayList containsを使用してこのArrayListに文字列が含まれているかどうかを確認したい場合、次のようにできるはずです。

if (this.rssFeedURLs.contains(rssFeedURL)) {

RssFeedURLは文字列です。

私は正しいか間違っていますか?

40
Mr Morgan

あなたが正しいです。 ArrayList.contains()は、オブジェクトの同一性ではなく、equals()をテストします。

このリストに(o == null?e == null:o.equals(e))などの要素eが少なくとも1つ含まれている場合にのみtrueを返します

NullPointerExceptionが発生した場合は、コンストラクターまたは宣言でリストを初期化したことを確認してください。例えば:

private List<String> rssFeedURLs = new ArrayList<String>();
65
Andy Thomas

はい、それは文字列で機能するはずですただし、重複が心配な場合はSetを使用してください。このコレクションは、何もしなくても重複を防ぎます。 HashSetは使用しても問題ありませんが、順序付けられていないため、挿入順序を保持する場合はLinkedHashSetを使用します。

17

あなたはそれが機能するはずであることは正しいです。おそらく、あなたは何かをインスタンス化するのを忘れました。コードは次のように見えますか?

String rssFeedURL = "http://stackoverflow.com";
this.rssFeedURLS = new ArrayList<String>();
this.rssFeedURLS.add(rssFeedURL);
if(this.rssFeedURLs.contains(rssFeedURL)) {
// this code will execute
}

参考のため、このコードを上記に追加すると、次の条件も実行されることに注意してください。

String copyURL = new String(rssFeedURL);
if(this.rssFeedURLs.contains(copyURL)) {
// code will still execute because contains() checks equals()
}

(rssFeedURL == copyURL)がfalseであっても、rssFeedURL.equals(copyURL)はtrueです。 containsメソッドは、equalsメソッドを処理します。

3
Michael McGowan

あなたの質問はあまり明確ではありません。

  • あなたのコードは正確に何をしていますか?コードを増やしてください。
  • 表示されているエラーは何ですか?

NULLポインターを取得すると言います。 contains()によって返される値としてNULLポインターを取得することはできません。

ただし、リストが初期化されていない場合は、NullPointerExceptionを取得できます。今、あなたの質問を読んで、ここに表示されているものは正しいと言いますが、リストをインスタンス化していないだけかもしれません。

これが機能するには(リストにない場合にフィードURLを追加するには):

if (!this.rssFeedURLs.contains(rssFeedURL)) {
    this.rssFeedURLs.add(rssFeedUrl);
}

この宣言は次のことを行います。

private ArrayList<String> rssFeedURLs = new ArrayList<String>();

または、後でメソッドをアクセスする前にリストを初期化します。

rssFeedUrls = new ArrayList<String>();

最後に...本当にListが必要ですか?重複を避けたいなら、おそらくSetの方が良いでしょう。順序を維持する場合は、LinkedHashSetを使用します。

1
haylem

おそらく、例外の原因となったコードを投稿する必要があります。上記がすべてである場合、おそらく実際にアレイを初期化できませんでした。

ここでcontainsを使用しても動作するはずです。

1
wds

正解です。あなたのコメントによると、他の人が言ったように、おそらくArrayListを初期化していないでしょう。

私のポイントは異なります:重複をチェックしていると主張しているため、containsメソッドを呼び出します。 HashSetを使用してみてください。何らかの理由でURLの順序を維持する必要がある場合を除き、より効率的なはずです。

0
Aviad Ben Dov

迅速に回答してくださった皆様に感謝します。常にセットを使用できましたが、現在ArrayListが機能しています。問題は、ArrayListを含むクラスのコンストラクターで、私が言っていなかったことです:

public RSS_Feed_Miner() {
    ...
    this.rssFeedURLs = new ArrayList<String>();
    ... 
}

どっ!金曜日の午後に。

0
Mr Morgan
ArrayList<String> newlyAddedTypes=new ArrayList<String>();

.....

newlyAddedTypes.add("test1");

newlyAddedTypes.add("test1");

newlyAddedTypes.add("test2");

if(newlyAddedTypes.contain("test"){
//called here
}
else{

}
0
Thilina Anuradh

右...文字列で...プリミティブまたは文字列から逸脱した瞬間に物事が変化し、ハッシュコード/等式を実装して必要な効果を得る必要があります。

編集:ArrayList<String>を初期化してから、アイテムの追加を試みます。

0
Aaron McIver

以下のコードでは、arraylistとしてtaskfilledを実行し、taskfilled arraylistに値を追加するメソッドとしてretrieveTaskidForDeleteを指定しています。checkidはstringです。arraylistに文字列値が含まれているかどうかを確認する必要があります。

String checkid;
ArrayList<String> taskfilled=retrieveTaskidForDelete();
                if(!taskfilled.contains(checkid)) {
                    Toast.makeText(getContext(),"Yepiee 
 Bingo"+ti.get(a),Toast.LENGTH_SHORT).show();
                }
0