【问题标题】:How can I check if an element exists in a Set of items?如何检查元素是否存在于一组项目中?
【发布时间】:2011-06-09 00:40:11
【问题描述】:

在 Java 中的 if 语句中,我如何检查对象是否存在于一组项目中。例如。 在这种情况下,我需要验证水果是苹果、橙子还是香蕉。

if (fruitname in ["APPLE", "ORANGES", "GRAPES"]) {
    //Do something
}

这是一件非常微不足道的事情,但我想不出一个简洁的方法来完成它。

【问题讨论】:

    标签: java collections


    【解决方案1】:
    static final List<String> fruits = Arrays.asList("APPLE", "ORANGES", "GRAPES");
    
    if (fruits.contains(fruitname))
    

    如果您的列表更大,那么一组会更有效率。

    static final Set<String> fruits = new HashSet<String>(
           Arrays.asList("APPLE", "ORANGES", "GRAPES", /*many more*/));
    

    【讨论】:

    • 不妨将其设为Set。似乎更合适。
    • @wds 实际上并没有 Arrays.asSet 方法,如果这是集合的唯一用途,那么额外的转换(到 Set)步骤似乎不值得。
    • 不适用于包含三个条目的列表。对于更多条目,它可能是值得的。
    • 我猜必须散列密钥实际上比在几十个元素的表中查找要花费更长的时间。尽管如此,Set 仍然是适合该工作的类型,即使特定的实现可能不是。
    • @wds,是的,对于少量条目,哪个更快并不重要。您可以在大约一毫秒内扫描一个包含 100K 条目的列表,这可能已经足够快了。
    【解决方案2】:

    Arrays.binarySearch 是您要找的吗?

    String [] fruits = new String[]{"APPLE", "ORANGES", "GRAPES"};
    Arrays.sort(fruits); // binarySearch requires that the array is sorted
    
    if (Arrays.binarySearch(fruits), fruitname) >= 0) {
      // found!
    }
    

    当然还有值得信赖的Apache Commons ArrayUtils

    if (ArrayUtils.contains(new String[]{"APPLE", "ORANGES", "GRAPES"}, fruitname){
      // found
    }
    

    我知道 Apache Commons 中会有一些东西 :)

    【讨论】:

    • 二分查找假设数组是有序的,我记得 O 在 G 之后 ;)
    • 我注意到 :) 所以我添加了一个排序。不过,我更喜欢您的解决方案(这是赞成票:)
    • @peter: 里面有一个 Array.sort() ;)
    • 感谢您的信息!对不起,彼得,我赞成你的评论;)
    • Arrays.sort 是一个 void 方法,所以这并不能真正编译。
    【解决方案3】:

    为了完整性,使用 google-collections/guava:

    import com.google.common.collect.Sets;
    
    static final Set<String> fruit = Sets.newHashSet("APPLE", "ORANGES", "GRAPES");
    
    if (fruit.contains(fruitname))
    

    或使用平面旧 jdk 类:

    static final Set<String> fruit = new HashSet<String>(Arrays.asList("APPLE", "ORANGES", "GRAPES"));
    

    【讨论】:

      【解决方案4】:

      如果您有SetListMap 的水果都具有相同的父母:Collection,您可以试试这个例子。

      String fruitName = "Orange";
      Collection<String> fruits = ... // set of fruits
      if (fruits.contains(fruitName)) {
          ...
      }
      

      (对于 Java 8/9/10 创建文字 Set 的方法,请参阅 this SO answer。)

      注意区分大小写(橙色!= 橙色)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-24
        • 2021-10-26
        • 1970-01-01
        • 2017-09-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多