我有一个String[],其值如下:
public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};
给定字符串s,是否有一种测试VALUES是否包含s的好方法?
我有一个String[],其值如下:
public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};
给定字符串s,是否有一种测试VALUES是否包含s的好方法?
当前回答
检查数组是否包含值的四种不同方法
使用列表:公共静态布尔useList(String[]arr,StringtargetValue){return Arrays.asList(arr).contains(targetValue);}使用集合:公共静态布尔useSet(String[]arr,StringtargetValue){Set<String>Set=newHashSet<String>(Arrays.asList(arr));return set。contains(targetValue);}使用简单循环:公共静态布尔useLoop(String[]arr,StringtargetValue){for(字符串s:arr){如果(s.equals(targetValue))返回true;}return false;}使用Arrays.binarySearch():下面的代码是错误的,为了完整起见,这里列出了它。binarySearch()只能用于已排序的数组。你会发现下面的结果很奇怪。这是对数组进行排序时的最佳选项。public static boolean binarySearch(String[]arr,StringtargetValue){return Arrays.binarySearch(arr,targetValue)>=0;}
快速示例:
String testValue="test";
String newValueNotInList="newValue";
String[] valueArray = { "this", "is", "java" , "test" };
Arrays.asList(valueArray).contains(testValue); // returns true
Arrays.asList(valueArray).contains(newValueNotInList); // returns false
其他回答
如果数组未排序,则必须遍历所有内容,并对每个内容调用equals。
如果数组已排序,则可以执行二进制搜索,Arrays类中有一个。
一般来说,如果要进行大量的成员身份检查,您可能希望将所有内容存储在集合中,而不是存储在数组中。
Java SE 9的简明更新
引用数组不正确。对于这种情况,我们需要一套。从Java SE 9开始,我们有Set.of。
private static final Set<String> VALUES = Set.of(
"AB","BC","CD","AE"
);
“给定字符串s,是否有测试VALUES是否包含s的好方法?”
VALUES.contains(s)
O(1)。
正确的类型,不可变,O(1)和简洁。漂亮*
原始答案详细信息
只是为了先清除代码。我们已(更正):
public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};
这是一个可变的静态,FindBugs会告诉你这是非常顽皮的。不要修改静态,也不要允许其他代码这样做。至少,该字段应该是私有的:
private static final String[] VALUES = new String[] {"AB","BC","CD","AE"};
(注意,实际上可以删除新的String[];位。)
引用数组仍然不好,我们需要一个集合:
private static final Set<String> VALUES = new HashSet<String>(Arrays.asList(
new String[] {"AB","BC","CD","AE"}
));
(偏执狂的人,比如我自己,如果这是用Collections.unmodifiedSet包装的话,可能会更放心——然后甚至可以公开。)
(*在品牌方面,集合API仍然可以预见地缺少不可变的集合类型,语法对于我的口味来说仍然过于冗长。)
检查数组是否包含值的四种不同方法
使用列表:公共静态布尔useList(String[]arr,StringtargetValue){return Arrays.asList(arr).contains(targetValue);}使用集合:公共静态布尔useSet(String[]arr,StringtargetValue){Set<String>Set=newHashSet<String>(Arrays.asList(arr));return set。contains(targetValue);}使用简单循环:公共静态布尔useLoop(String[]arr,StringtargetValue){for(字符串s:arr){如果(s.equals(targetValue))返回true;}return false;}使用Arrays.binarySearch():下面的代码是错误的,为了完整起见,这里列出了它。binarySearch()只能用于已排序的数组。你会发现下面的结果很奇怪。这是对数组进行排序时的最佳选项。public static boolean binarySearch(String[]arr,StringtargetValue){return Arrays.binarySearch(arr,targetValue)>=0;}
快速示例:
String testValue="test";
String newValueNotInList="newValue";
String[] valueArray = { "this", "is", "java" , "test" };
Arrays.asList(valueArray).contains(testValue); // returns true
Arrays.asList(valueArray).contains(newValueNotInList); // returns false
可以使用Arrays类对值执行二进制搜索。如果数组未排序,则必须使用同一类中的排序函数对数组进行排序,然后对其进行搜索。
对于有限长度的阵列,请使用以下内容(由camickr提供)。这对于重复检查来说是缓慢的,特别是对于较长的阵列(线性搜索)。Arrays.asList(…).incontains(…)如果您重复检查一组较大的元素,则可获得快速性能数组结构错误。使用TreeSet并将每个元素添加到其中。它对元素进行排序,并具有快速的exist()方法(二进制搜索)。如果元素实现Comparable,则需要对TreeSet进行相应排序:ElementClass.compareTo()方法必须与ElementClass.equals()兼容:是否看到三合会未出现战斗?(Java Set缺少项目)TreeSet myElements=新TreeSet();//对每个元素执行此操作(实现*可比*)myElements.add(nextElement);//*或者*,如果从其他代码强制提供数组:myElements.addAll(Arrays.asList(myArray));否则,请使用您自己的比较器:类MyComparator实现Comparator<ElementClass>{int compareTo(ElementClass元素1;ElementClass元素2){//元素的比较//应与对象相等性一致}布尔等于(对象otherComparator){//您的比较器相等}}//用比较器构造TreeSetTreeSet myElements=新TreeSet(新MyComparator());//对每个元素执行此操作(实现*可比*)myElements.add(nextElement);回报:检查某些元素的存在://通过排序元素进行快速二进制搜索(性能~日志(大小)):boolean containsElement=myElements.exists(someElement);