我有一个String[]
,其值以下所示: html
public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};
给定String s
,是否存在测试VALUES
是否包含s
的好方法? java
Arrays.asList(yourArray).contains(yourValue)
警告:这不适用于图元数组(请参见注释)。 api
String[] values = {"AB","BC","CD","AE"}; boolean contains = Arrays.stream(values).anyMatch("s"::equals);
要检查int
, double
或long
数组是否包含值, LongStream
分别使用IntStream
, DoubleStream
或LongStream
。 数组
int[] a = {1,2,3,4}; boolean contains = IntStream.of(a).anyMatch(x -> x == 4);
您能够使用Arrays类对值执行二进制搜索。 若是未对数组进行排序,则必须使用同一类中的sort函数对数组进行排序,而后对其进行搜索。 oracle
若是数组未排序,则必须遍历全部内容并在每一个数组上调用equals。 函数
若是数组已排序,则能够进行二进制搜索, Arrays类中有一个。 测试
通常来讲,若是要进行大量成员资格检查,则可能须要将全部内容存储在Set中,而不是存储在数组中。 spa
只是为了清除代码。 咱们(已更正): code
public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};
这是一个可变的静态函数,FindBugs会告诉您这很顽皮。 它应该是私有的: htm
private static final String[] VALUES = new String[] {"AB","BC","CD","AE"};
(请注意,您实际上能够删除new String[];
位。)
所以,引用数组是很差的,特别是在这里咱们须要一个集合:
private static final Set<String> VALUES = new HashSet<String>(Arrays.asList( new String[] {"AB","BC","CD","AE"} ));
(若是像我这样的偏执狂人,若是将其包装在Collections.unmodifiableSet
,则可能会更放心-甚至能够将其公开。)
“给出String,是否有测试VALUES是否包含s的好方法?”
VALUES.contains(s)
O(1)。
更新:从Java SE 9开始,咱们有了Set.of
private static final Set<String> VALUES = Set.of( "AB","BC","CD","AE" );
正确的类型 , 不可变 , O(1)和简洁 。 美丽。
(要进一步了解品牌,Collections API仍会缺乏不可变的collection类型,而且就个人口味而言,语法仍然过于冗长。)
ObStupidAnswer(但我认为这里有一个教训):
enum Values { AB, BC, CD, AE } try { Values.valueOf(s); return true; } catch (IllegalArgumentException exc) { return false; }