在Java ArrayList <String>中使用contains

如果我有一个String的ArrayList,它构成了Java中类的一部分,如下所示:

private ArrayList<String> rssFeedURLs;

如果我想在包含上面的ArrayList的类中使用一个方法,使用ArrayList包含检查一个String是否包含在这个ArrayList中,我相信我应该可以这样做,如下所示:

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

其中rssFeedURL是一个string。

我是对还是错?

你是对的。 ArrayList.contains()testingequals(),而不是对象标识:

返回true当且仅当此列表包含至less一个元素e,使得(o == null?e == null:o.equals(e))

如果你有一个NullPointerExceptionexception,请validation你是否在构造函数或声明中初始化了你的列表。 例如:

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

是的,这应该适用于string, 但如果你担心重复使用Set 。 这个集合可以防止重复而不必做任何事情。 一个HashSet可以使用,但它是无序的,所以如果你想保持插入顺序你使用LinkedHashSet

你是对的,它应该工作; 也许你忘了实例化一些东西。 你的代码看起来像这样吗?

 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)也是如此。 包含方法关心equals方法。

也许你需要发布导致你的exception的代码。 如果以上是你所有的,也许你只是没有实际初始化数组。

使用包含在这里应该虽然工作。

你的问题不是很清楚。

  • 你的代码到底在做什么? 给更多的代码。
  • 你得到的错误是什么?

你说你得到一个空指针。 你不能得到一个空指针作为由contains()返回的值。

但是,如果您的列表尚未初始化,则可能会发生NullPointerException 。 现在通过阅读你的问题,我会说,你在这里显示的是正确的,但也许你没有实例化列表。

要做到这一点(要添加一个提要的URL,如果它不在列表中):

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

那么这个声明会做:

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

或者稍后初始化您的列表,但在尝试访问其方法之前:

 rssFeedUrls = new ArrayList<String>(); 

最后…你真的需要一个List吗? 如果你不想重复,也许会更好。 如果保留sorting事项,请使用LinkedHashSet

正确…用string…当你偏离原语或string的时候事情就会改变,你需要实现hashcode / equals来获得所需的效果。

编辑:初始化您的ArrayList<String>然后尝试添加一个项目。

你是对的 正如别人根据你的意见说,你可能没有初始化你的ArrayList。

我的观点是不同的:你声称你正在检查重复,这就是为什么你调用contains方法。 尝试使用HashSet 。 它应该更有效率 – 除非您需要保持URL的顺序出于任何原因。

感谢大家回答如此之快。 我总是可以使用一个集合,但我现在有ArrayList的工作。 问题是,在包含ArrayList的类的构造函数中,我没有说:

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

D'哦! 星期五下午。

 ArrayList<String> newlyAddedTypes=new ArrayList<String>(); ..... newlyAddedTypes.add("test1"); newlyAddedTypes.add("test1"); newlyAddedTypes.add("test2"); if(newlyAddedTypes.contain("test"){ //called here } else{ } 

在下面的代码中,我们将任务填充为arraylist,retrieveTaskidForDelete作为我们在任务填充的arraylist中添加值的方法,checkid是String.we需要检查string值是否包含在arraylist中。

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