Что означает это утверждение? - PullRequest
1 голос
/ 29 июня 2009

Я новичок в Java и не понимаю, что означает if(!s.add(a)) в этом фрагменте кода:

Set<String> s = new HashSet<String>();
for(String a:args) {
    if(!s.add(a)) System.out.println("Duplicate detected:"+a);
}

Ответы [ 11 ]

10 голосов
/ 29 июня 2009

add указывается в интерфейсе Collection для возврата boolean, указывающего, было ли добавление успешным Из Javadocs:

Возвращает true, если эта коллекция изменилась в результате вызова. (Возвращает false, если эта коллекция не допускает дублирования и уже содержит указанный элемент.)

Этот код выводит сообщение, если добавление было неудачным, что происходит, когда в наборе есть дубликат.

6 голосов
/ 29 июня 2009

если в коллекции s уже есть элемент a, метод add вернет false. ! является оператором «не», превращая ложь в истину. Итак, если элемент уже находится в коллекции, вы увидите результат println.

3 голосов
/ 29 июня 2009

s.add () вернет логическое значение в зависимости от того, был ли элемент добавлен в коллекцию (true) или нет (false)

2 голосов
/ 29 июня 2009

Как ответили другие, add возвращает логическое значение, указывающее, был ли a добавлен в набор. Это эквивалентно

Set<String> s = new HashSet<String>();
for(String a:args) {
    if (s.contains(a)){
      System.out.println("Duplicate detected:"+a);
    }
    else{
       s.add(a);
    }
}

Из javadoc для интерфейса Set.

contains

boolean contains(Object o)

     Returns true if this set contains the specified element.
     More formally, returns true if and only if this set contains
     an element e such that (o==null ? e==null :o.equals(e)).
2 голосов
/ 29 июня 2009

Метод add возвращает логическое значение, указывающее, было ли добавление выполнено успешно. Может быть яснее с отступом:

Set<String> s = new HashSet<String>();
for(String a:args)
    if(!s.add(a))
        System.out.println("Duplicate detected:"+a);

Или еще лучше с фигурными скобками:

Set<String> s = new HashSet<String>();
for(String a:args) {
    if(!s.add(a)) {
            System.out.println("Duplicate detected:"+a);
    }
}

Сообщение отображается, если добавление не удалось.

1 голос
/ 29 июня 2009

s.add(a) добавит a к набору, только если оно еще не содержится в наборе (по равенству). Метод add возвращает true, если операция вызывает изменение набора.

следовательно, если a уже было в Set, метод add не добавит его снова, поэтому не изменит набор, поэтому вернет false.

0 голосов
/ 25 января 2016

Представлено на ваше рассмотрение:

import java.util.Set;
import java.util.HashSet;

public class s1 {
    public static final boolean DUPLICATE = false;
    public static void main( String[] args ) {
        Set<String> s = new HashSet<String>();

        if (!s.add("Hello Bub")) System.out.println("Duplicate detected(1)");

        if (s.add("Hello Bub") == DUPLICATE) System.out.println("Duplicate detected(2)");
    }
}

Что кажется более понятным?

0 голосов
/ 29 июня 2009

Нет объекта Set, допускающего дублирование. Объект HashSet также не допускает дублирование, но метод get () (put () и contains () тоже) выполняется в постоянное время O (k), поэтому это хороший способ проверить наличие дубликатов.

0 голосов
/ 29 июня 2009

Структура данных Set может содержать только уникальные значения.

Метод add (Object) вернет false, если объект не может быть добавлен (т.е. это дублирующая запись).

Метод вернет true, если объект был добавлен в набор.

0 голосов
/ 29 июня 2009

"!" является символом «НЕ».

Прочитайте как:

'если не добавить аргумент a в хешсет s, то ...'

OR

'если при добавлении аргумента a в хешсет s возвращается false, то ...'

...