【问题标题】:Check if a value exists in ArrayList检查 ArrayList 中是否存在值
【发布时间】:2011-05-23 04:33:56
【问题描述】:

如何检查在扫描仪中写入的值是否存在于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();

【问题讨论】:

标签: java arraylist contains


【解决方案1】:

只需使用ArrayList.contains(desiredElement)。例如,如果您要查找示例中的 conta1 帐户,则可以使用以下内容:

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

编辑: 请注意,为了使其正常工作,您需要正确覆盖 equals()hashCode() 方法。如果您使用的是 Eclipse IDE,那么您可以通过首先打开 CurrentAccount 对象的源文件并选择 Source &gt; Generate hashCode() and equals()... 来生成这些方法

【讨论】:

  • equals() 方法应该在 CurrentAccount 中被覆盖以确定它们何时是同一个对象
  • 在这种情况下 hashcode() 也需要被覆盖。每个 hashcode() 合约相等的对象必须具有相等的哈希码。
  • @zockman 确定你是对的,尽管我认为在这种情况下覆盖 equals 更为重要,因为如果不是 CurrentAccount 对象,即使它们的所有属性都具有相同的值,它们也可能不相同。但我也同意覆盖 hashcode()。
  • 有比较对象引用的版本吗?
  • 您好,是否可以检查列表是否包含“Alberto Carlos”?
【解决方案2】:

在检查值是否存在时,使用HashSet 比使用ArrayList 更好。 HashSet 的 Java 文档说:"This class offers constant time performance for the basic operations (add, remove, contains and size)"

ArrayList.contains() 可能需要遍历整个列表才能找到您要查找的实例。

【讨论】:

    【解决方案3】:

    请参考我在this post上的回答。

    无需遍历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));
    
    }
    

    【讨论】:

    • 你正在使用 == 来比较字符串
    • 你应该使用equals()而不是==来比较字符串this.name.equals(employee.getName())
    • 救了我的命,兄弟。可以给你买一两杯啤酒 :)
    【解决方案4】:

    如果我们提供了equalshashCode的实现,我们可以使用contains方法检查一个项目是否存在,否则将使用对象引用进行相等比较。同样在列表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
    

    【讨论】:

    • 感谢您提供这个惊人的答案,实际上它是 +1 !我使用了这部分代码:boolean itemExistsBasedOnProp = selectedR.stream().map(Request::getDesc).anyMatch(cn::equals); 现在我需要它来提取该项目!有可能吗??
    • 调用需要 API 级别 24(当前最低为 19):java.util.Collection#stream
    • 当我们有一个 POJO 列表并且我们想要检查 POJO 中存在的属性集中的任何值时,此解决方案也有效
    【解决方案5】:

    只需使用.contains。例如,如果要检查 ArrayList arr 是否包含值 val,则只需运行 arr.contains(val),它将返回一个布尔值,表示该值是否包含。有关详细信息,请参阅 docs 以获取 .contains

    【讨论】:

      【解决方案6】:

      当 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 
      

      How to compare Objects attributes in an ArrayList?

      我希望这个解决方案对您有所帮助。 谢谢

      【讨论】:

        【解决方案7】:
        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");         
                }
            } 
        }
        

        【讨论】:

          【解决方案8】:

          下面的代码可以帮助

          List<CurrentAccount> lista = new ArrayList<CurrentAccount>();
          CurrentAccount conta5 = new CurrentAccount("Pedro Fonseca", 500);
          boolean isAdded = lista.contains(model);
          

          ArrayList 已经有相同的名称,所以它返回 true

          import com.google.gson.annotations.SerializedName;    
          import java.util.Objects;
          
          public class CurrentAccount {
          
              @SerializedName("Name")
              private String name;
              
              @SerializedName("Balance")
              private int balance;
          
          
              public String getName() {
                  return name;
              }
          
              public void setName(String name) {
                  this.name = name;
              }
          
              public int getBalance() {
                  return balance;
              }
          
              public void setBalance(int balance) {
                  this.balance = balance;
              }
          
              public CurrentAccount(String name, int balance) {
                  this.name = name;
                  this.balance = balance;
              }
              
              @Override
              public boolean equals(Object o) {
                  if (this == o) return true;
                  if (o == null || getClass() != o.getClass()) return false;
                  CurrentAccount model = (CurrentAccount) o;
                  return name.equals(model.name);
              }
          
              @Override
              public int hashCode() {
                  return Objects.hash(name);
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2018-11-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-11-28
            • 2016-01-24
            相关资源
            最近更新 更多