如何检查元素是不是存在于一组项目中?
Posted
技术标签:
【中文标题】如何检查元素是不是存在于一组项目中?【英文标题】: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
这是一件非常微不足道的事情,但我想不出一个简洁的方法来完成它。
【问题讨论】:
【参考方案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】:如果您有Set
、List
、Map
的水果都具有相同的父母:Collection
,您可以试试这个例子。
String fruitName = "Orange";
Collection<String> fruits = ... // set of fruits
if (fruits.contains(fruitName))
...
(对于 Java 8/9/10 创建文字 Set
的方法,请参阅 this SO answer。)
注意区分大小写(橙色!= 橙色)。
【讨论】:
以上是关于如何检查元素是不是存在于一组项目中?的主要内容,如果未能解决你的问题,请参考以下文章
在 JavaScript 中如何检查 html 元素是不是存在?