Использование содержит в Java ArrayList <String> - PullRequest
40 голосов
/ 15 октября 2010

Если у меня есть ArrayList из String, образующий часть класса в Java, например:

private ArrayList<String> rssFeedURLs;

Если я хочу использовать метод в классе, содержащем вышеуказанный ArrayList,использование ArrayList содержит, чтобы проверить, содержится ли строка в этом ArrayList, я считаю, что я должен быть в состоянии сделать это следующим образом:

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

Где rssFeedURL является строкой.

Прав ли яили неправильно?

Ответы [ 10 ]

65 голосов
/ 15 октября 2010

Вы правы. ArrayList.contains () проверяет equals (), а не идентификатор объекта:

возвращает true, если и только если этот список содержит хотя бы один элемент е такой что (o == ноль? e == ноль: o.equals (e))

Если вы получили исключение NullPointerException, убедитесь, что вы инициализировали свой список либо в конструкторе, либо в объявлении. Например:

private List<String> rssFeedURLs = new ArrayList<String>();
17 голосов
/ 15 октября 2010

Да, это должно работать для строк, , но если вы беспокоитесь о дубликатах, используйте Set. Эта коллекция предотвращает дублирование без необходимости что-либо делать. HashSet можно использовать, но он неупорядочен, поэтому, если вы хотите сохранить порядок вставки, вы используете LinkedHashSet.

3 голосов
/ 15 октября 2010

Вы правы, что это должно работать; возможно, вы забыли создать экземпляр чего-либо. Ваш код выглядит примерно так?

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.

1 голос
/ 15 октября 2010

Ваш вопрос не очень понятен.

  • Что именно делает ваш код?Дайте больше кода.
  • Какую ошибку вы получаете?

Вы говорите, что получаете нулевой указатель.Вы не можете получить нулевой указатель как значение, возвращаемое contains().

Однако вы можете получить 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 голос
/ 15 октября 2010

Возможно, вам нужно опубликовать код, вызвавший ваше исключение.Если все вышеперечисленное - это все, что у вас есть, возможно, вы просто не смогли на самом деле инициализировать массив.

0 голосов
/ 12 сентября 2017

В приведенном ниже коде мы заполнили задачу как arraylist, retrieveTaskidForDelete как метод, с помощью которого мы добавляем значение в заполненный задачей arraylist, а 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 голосов
/ 12 мая 2015
ArrayList<String> newlyAddedTypes=new ArrayList<String>();

.....

newlyAddedTypes.add("test1");

newlyAddedTypes.add("test1");

newlyAddedTypes.add("test2");

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

}
0 голосов
/ 15 октября 2010

Спасибо вам всем за быстрый ответ.Я всегда мог использовать набор, но у меня сейчас работает ArrayList.Проблема заключалась в том, что в конструкторе класса, содержащего ArrayList, я не говорил:

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

D'Oh!в пятницу днем.

0 голосов
/ 15 октября 2010

Ты прав.Как говорили другие в соответствии с вашими комментариями, вы, вероятно, не инициализировали свой ArrayList.

Моя точка зрения другая: вы утверждали, что проверяете наличие дубликатов, и именно поэтому вы вызываете метод contains.Попробуйте использовать HashSet.Это должно быть более эффективно - если вам не нужно поддерживать порядок URL-адресов по любой причине.

0 голосов
/ 15 октября 2010

Правильно ... со строками ... в тот момент, когда вы отклоняетесь от примитивов или строк, все меняется, и вам нужно реализовать хэш-код / ​​равно для получения желаемого эффекта.

РЕДАКТИРОВАТЬ: инициализировать ArrayList<String>, а затем попытаться добавить элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...