Использование содержит в Java ArrayList <String>
Если у меня есть ArrayList из String, являющийся частью класса в Java, например:
private ArrayList<String> rssFeedURLs;
Если я хочу использовать метод в классе, содержащем вышеуказанный ArrayList, используя ArrayList, чтобы проверить, содержится ли String в этом массиве ArrayList, я считаю, что я должен сделать это следующим образом:
if (this.rssFeedURLs.contains(rssFeedURL)) {
Где rssFeedURL - это строка.
Я прав или неправ?
Ответы
Ответ 1
Вы правы. Тест ArrayList.contains() равен(), а не идентификатору объекта:
возвращает true тогда и только тогда, когда этот список содержит по крайней мере один элемент e такой что (o == null? e == null: o.equals(e))
Если вы получили исключение NullPointerException, убедитесь, что вы инициализировали свой список, либо в конструкторе, либо в объявлении. Например:
private List<String> rssFeedURLs = new ArrayList<String>();
Ответ 2
Да, это должно работать для строк, , но если вы беспокоитесь о дубликатах, используйте Set
. Эта коллекция предотвращает дублирование без необходимости делать что-либо. A HashSet
в порядке, но он неупорядочен, поэтому, если вы хотите сохранить порядок вставки, вы используете LinkedHashSet
.
Ответ 3
Вы правы, что он должен работать; возможно, вы забыли что-то создать. Ваш код выглядит примерно так?
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) является ложным, rssFeedURL.equals(copyURL) истинно. Метод contains заботится об эквивалентном методе.
Ответ 4
Возможно, вам нужно опубликовать код, вызвавший ваше исключение. Если это все, что у вас есть, возможно, вы просто не смогли инициализировать массив.
Использование здесь здесь должно работать.
Ответ 5
Ваш вопрос не очень понятен.
- Что именно делает ваш код? Дайте больше кода.
- Какая ошибка вы получаете?
Вы говорите, что получаете нулевой указатель. Вы не можете получить нулевой указатель как значение, возвращаемое 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
будет лучше, если вы не захотите дублировать. Используйте <<27 > , если сохранить порядок.
Ответ 6
Правильно... со строками... когда вы отклоняетесь от примитивов или строк, все меняется, и вам нужно реализовать hashcode/equals, чтобы получить желаемый эффект.
EDIT: Инициализируйте свой ArrayList<String>
, затем попытайтесь добавить элемент.
Ответ 7
Ты прав. Как говорили другие, согласно вашим комментариям, вы, вероятно, не инициализировали свой ArrayList.
Моя точка зрения другая: вы утверждали, что проверяете дубликаты, и поэтому вы вызываете метод contains. Попробуйте использовать HashSet
. Он должен быть более эффективным - если вам не нужно сохранять порядок URL-адресов по какой-либо причине.
Ответ 8
Спасибо всем, кто так быстро ответил. Я всегда мог использовать набор, но теперь у меня есть ArrayList. Проблема заключалась в том, что в конструкторе класса, содержащего ArrayList, я не говорил:
public RSS_Feed_Miner() {
...
this.rssFeedURLs = new ArrayList<String>();
...
}
D'Oh! в пятницу днем.
Ответ 9
ArrayList<String> newlyAddedTypes=new ArrayList<String>();
.....
newlyAddedTypes.add("test1");
newlyAddedTypes.add("test1");
newlyAddedTypes.add("test2");
if(newlyAddedTypes.contain("test"){
//called here
}
else{
}
Ответ 10
В приведенном ниже коде мы заданы как arraylist, retrieveTaskidForDelete как метод, по которому мы добавляем значение в заполненный заданием arraylist, а checkid - String.we нужно проверить, содержит ли строковое значение в arraylist.
String checkid;
ArrayList<String> taskfilled=retrieveTaskidForDelete();
if(!taskfilled.contains(checkid)) {
Toast.makeText(getContext(),"Yepiee
Bingo"+ti.get(a),Toast.LENGTH_SHORT).show();
}