【问题标题】:How to Check if an ArrayList Contain 2 values?如何检查 ArrayList 是否包含 2 个值?
【发布时间】:2013-12-24 05:38:02
【问题描述】:

有什么方法可以检查一个集合是否包含一个或更多的值,并且比使用包含循环两次具有更好的性能?

其他意思是看起来像这样的东西

person.contains("Joe" || "Jasha");

【问题讨论】:

    标签: java collections arraylist


    【解决方案1】:

    简单地使用数组类

    person.containsAll(Arrays.asList("Jasha","Joe"));
    

    【讨论】:

      【解决方案2】:

      contains 只需要一个参数

      if(person.contains("Joe") || person.contains("Jasha")){
        // do something
        }
      

      如果您担心N 的元素数量

      String[] items ={"Joe","jon","And So On".....};
      for (String item : items ) {
          if (person.contains(item)) {
             //found
              break; 
          } 
      }
      

      编辑:

      || 对您的情况最有帮助,因为您受益于 Short-circuit_evaluation

      仅当第一个参数不足以确定表达式的值时,才会执行或计算第二个参数:

      【讨论】:

      • 我知道这个答案,但看起来会更短
      【解决方案3】:

      ArrayList.contains() 的实现循环遍历每个元素并进行equals() 测试,因此调用.contains() 两次效率低下。

      您可以编写自己的循环,使用已编译的正则表达式 Pattern 同时查找任一名称,同时检查两者:

      Pattern p = Pattern.compile("Joe|Jasha");
      boolean found = false;
      for (String s : person) {
          if (p.matcher(s).find()) {
              found = true;
              break;
          }
      }
      

      【讨论】:

      • 正是我想要的!
      【解决方案4】:

      你也可以像下面这样使用正则表达式:

      person.toString().matches(".*\\b(Joe|Jasha)\\b.*");
      

      您将获得一个布尔值,指示它是否存在。

      【讨论】:

      • 太棒了!!
      【解决方案5】:

      你也可以这样做

      String person1 = "Joe Smith"; // contains "Joe"
      String person2 = "Jasha Thompson"; // contains "Jasha"
      String person3 = "Jasha Joesephson"; // contains "Joe" and "Jasha"
      String person4 = "Steve Smith"; // contains neither
      
      public boolean containsJoeOrJasha(String stringToCheck) {
        return !Collections.disjoint(
          Arrays.asList(stringToCheck.split(" ")),
          Arrays.asList("Joe", "Jasha"));
      }
      

      Collections.disjoint 如果两个集合 disjoint 则返回 true,这意味着它们没有共同的元素。所以……

      jshell> containsJoeOrJasha(person1)
      $33 ==> true
      
      jshell> containsJoeOrJasha(person2)
      $34 ==> true
      
      jshell> containsJoeOrJasha(person3)
      $35 ==> true
      
      jshell> containsJoeOrJasha(person4)
      $36 ==> false
      

      【讨论】:

        【解决方案6】:

        你必须搜索每个字符串。

        更新

        List list=new ArrayList();
        list.add("Joe");
        list.add("Jasha");
        if(person.containsAll(list))
        {
           //do something
        }
        

        【讨论】:

        • 如果用户有 N 个元素怎么办?
        • 没想到。 :)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-03
        • 1970-01-01
        • 2016-03-25
        • 2021-05-27
        • 2012-05-03
        • 1970-01-01
        • 2021-04-27
        相关资源
        最近更新 更多