我有一个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的好方法?
当前回答
你可以用两种方法检查
A) 通过将数组转换为字符串,然后通过.incontains方法检查所需的字符串
String a = Arrays.toString(VALUES);
System.out.println(a.contains("AB"));
System.out.println(a.contains("BC"));
System.out.println(a.contains("CD"));
System.out.println(a.contains("AE"));
B) 这是一种更有效的方法
Scanner s = new Scanner(System.in);
String u = s.next();
boolean d = true;
for (int i = 0; i < VAL.length; i++) {
if (VAL[i].equals(u) == d)
System.out.println(VAL[i] + " " + u + VAL[i].equals(u));
}
其他回答
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仍然可以预见地缺少不可变的集合类型,语法对于我的口味来说仍然过于冗长。)
值得一提的是,我进行了一次测试,比较了3个速度建议。我生成了随机整数,将它们转换为字符串并添加到数组中。然后我搜索了可能最高的数字/字符串,这对于asList().contains()来说是最坏的情况。
使用10K阵列大小时,结果是:
Sort & Search : 15
Binary Search : 0
asList.contains : 0
当使用100K阵列时,结果是:
Sort & Search : 156
Binary Search : 0
asList.contains : 32
因此,如果数组是按排序顺序创建的,那么二进制搜索是最快的,否则asList().concludes将是最好的方法。如果您有很多搜索,那么对数组进行排序可能是值得的,这样您就可以使用二进制搜索。这取决于您的应用程序。
我认为这是大多数人所期望的结果。以下是测试代码:
import java.util.*;
public class Test {
public static void main(String args[]) {
long start = 0;
int size = 100000;
String[] strings = new String[size];
Random random = new Random();
for (int i = 0; i < size; i++)
strings[i] = "" + random.nextInt(size);
start = System.currentTimeMillis();
Arrays.sort(strings);
System.out.println(Arrays.binarySearch(strings, "" + (size - 1)));
System.out.println("Sort & Search : "
+ (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
System.out.println(Arrays.binarySearch(strings, "" + (size - 1)));
System.out.println("Search : "
+ (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
System.out.println(Arrays.asList(strings).contains("" + (size - 1)));
System.out.println("Contains : "
+ (System.currentTimeMillis() - start));
}
}
在下面使用-
String[] values = {"AB","BC","CD","AE"};
String s = "A";
boolean contains = Arrays.stream(values).anyMatch(v -> v.contains(s));
创建初始设置为false的布尔值。运行一个循环来检查数组中的每个值,并与要检查的值进行比较。如果找到匹配项,请将布尔值设置为true并停止循环。然后断言布尔值为真。
如果你不想区分大小写
Arrays.stream(VALUES).anyMatch(s::equalsIgnoreCase);