Проверьте, существует ли значение в ArrayList

179

Как я могу проверить, существует ли значение, записанное в сканере, в ArrayList?

List<CurrentAccount> lista = new ArrayList<CurrentAccount>();

CurrentAccount conta1 = new CurrentAccount("Alberto Carlos", 1052);
CurrentAccount conta2 = new CurrentAccount("Pedro Fonseca", 30);
CurrentAccount conta3 = new CurrentAccount("Ricardo Vitor", 1534);
CurrentAccount conta4 = new CurrentAccount("João Lopes", 3135);

lista.add(conta1);
lista.add(conta2);
lista.add(conta3);
lista.add(conta4);

Collections.sort(lista);

System.out.printf("Bank Accounts:" + "%n");
Iterator<CurrentAccount> itr = lista.iterator();
while (itr.hasNext()) {
    CurrentAccount element = itr.next();
    System.out.printf(element + " " + "%n");
}
System.out.println();
daniel__
источник
1
Решение Java 8: stackoverflow.com/a/51837794/1216775
akhil_mittal

Ответы:

320

Просто используйте ArrayList.contains (требуемый элемент) . Например, если вы ищете учетную запись conta1 из вашего примера, вы можете использовать что-то вроде:

if (lista.contains(conta1)) {
    System.out.println("Account found");
} else {
    System.out.println("Account not found");
}

Редактировать: Обратите внимание, что для того, чтобы это работало, вам нужно правильно переопределить методы equals () и hashCode () . Если вы используете Eclipse IDE, то эти методы можно сгенерировать, сначала открыв исходный файл для вашего CurrentAccountобъекта и выбравSource > Generate hashCode() and equals()...

GreenMatt
источник
9
Метод equals () должен быть переопределен в CurrentAccount, чтобы определить, когда они являются одним и тем же объектом
Javi
3
В этом случае hashcode () также необходимо переопределить. В контракте hashcode () одинаковые объекты должны иметь одинаковые хеш-коды.
zockman
@zockman уверен, что вы правы, хотя я думаю, что переопределение equals еще более важно в этом случае, потому что в противном случае объект CurrentAccount может не совпадать, даже если все их атрибуты имеют одинаковое значение. Но я согласен с переопределением hashcode () тоже.
Хави
Есть ли версия, которая сравнивает ссылки на объекты?
Томаш Зато - Восстановить Монику
Привет, можно ли проверить список, если он содержит "Альберто Карлос"?
Джесси
47

Лучше использовать, HashSetчем ArrayListкогда вы проверяете наличие значения. Java документы для HashSetговорит:"This class offers constant time performance for the basic operations (add, remove, contains and size)"

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

SBA
источник
16

Пожалуйста, обратитесь к моему ответу на этот пост .

Нет необходимости перебирать Listпросто перезаписывать equalsметод.

Используйте equalsвместо==

@Override
public boolean equals (Object object) {
    boolean result = false;
    if (object == null || object.getClass() != getClass()) {
        result = false;
    } else {
        EmployeeModel employee = (EmployeeModel) object;
        if (this.name.equals(employee.getName()) && this.designation.equals(employee.getDesignation())   && this.age == employee.getAge()) {
            result = true;
        }
    }
    return result;
}

Назовите это так:

public static void main(String args[]) {

    EmployeeModel first = new EmployeeModel("Sameer", "Developer", 25);
    EmployeeModel second = new EmployeeModel("Jon", "Manager", 30);
    EmployeeModel third = new EmployeeModel("Priyanka", "Tester", 24);

    List<EmployeeModel> employeeList = new ArrayList<EmployeeModel>();
    employeeList.add(first);
    employeeList.add(second);
    employeeList.add(third);

    EmployeeModel checkUserOne = new EmployeeModel("Sameer", "Developer", 25);
    System.out.println("Check checkUserOne is in list or not");
    System.out.println("Is checkUserOne Preasent = ? " + employeeList.contains(checkUserOne));

    EmployeeModel checkUserTwo = new EmployeeModel("Tim", "Tester", 24);
    System.out.println("Check checkUserTwo is in list or not");
    System.out.println("Is checkUserTwo Preasent = ? " + employeeList.contains(checkUserTwo));

}
Самер Кази
источник
4
Вы используете == для сравнения строк
Mightian
2
Вы должны использовать equals () вместо == для сравнения строкthis.name.equals(employee.getName())
Lucky
1
спас мне жизнь, братан. мог купить тебе пива или два рн :)
Кеннеди Камбо
10

Мы можем использовать containsметод , чтобы проверить , если элемент существует , если мы обеспечили реализацию equalsи hashCodeеще ссылку на объект будет использоваться для сравнения на равенство. Кроме того, в случае списка containsявляется O(n)операция , где , как это O(1)для HashSetтак лучше , чтобы использовать позже. В Java 8 мы можем использовать потоки также для проверки элемента на основе его равенства или на основе определенного свойства.

Java 8

CurrentAccount conta5 = new CurrentAccount("João Lopes", 3135);
boolean itemExists = lista.stream().anyMatch(c -> c.equals(conta5)); //provided equals and hashcode overridden
System.out.println(itemExists); // true

String nameToMatch = "Ricardo Vitor";
boolean itemExistsBasedOnProp = lista.stream().map(CurrentAccount::getName).anyMatch(nameToMatch::equals);
System.out.println(itemExistsBasedOnProp); //true
akhil_mittal
источник
спасибо за этот удивительный ответ на самом деле это +1! Я использовал эту часть кода: boolean itemExistsBasedOnProp = selectedR.stream().map(Request::getDesc).anyMatch(cn::equals);теперь мне нужно извлечь этот элемент! Является ли это возможным ??
Марием нейли
1
@maryemneyli использовать findAny: docs.oracle.com/javase/8/docs/api/java/util/stream/…
akhil_mittal
Для вызова требуется уровень API 24 (текущий минимум 19):java.util.Collection#stream
Ширин
2

Просто используйте .contains. Например, если вы проверяете, arrсодержит ли ArrayList значение val, вы просто запустите arr.contains(val), что вернет логическое представление, если значение содержится. Для получения дополнительной информации см. Документы для .contains.

codingpower472
источник
1

Когда Array List содержит объект Primitive DataType.

Use this function:
arrayList.contains(value);

if list contains that value then it will return true else false.

Когда Array List содержит объект UserDefined DataType.

Follow this below Link 

Как сравнить атрибуты объектов в ArrayList?

Я надеюсь, что это решение поможет вам. Спасибо

Аман Гоял
источник
1
public static void linktest()
{
    System.setProperty("webdriver.chrome.driver","C://Users//WDSI//Downloads/chromedriver.exe");
    driver=new ChromeDriver();
    driver.manage().window().maximize();
    driver.get("http://toolsqa.wpengine.com/");
    //List<WebElement> allLinkElements=(List<WebElement>) driver.findElement(By.xpath("//a"));
    //int linkcount=allLinkElements.size();
    //System.out.println(linkcount);
    List<WebElement> link = driver.findElements(By.tagName("a"));
    String data="HOME";
    int linkcount=link.size();
    System.out.println(linkcount);
    for(int i=0;i<link.size();i++) { 
        if(link.get(i).getText().contains(data)) {
            System.out.println("true");         
        }
    } 
}
Prasanth R i-load Testing Eng
источник