Scanner input = new Scanner(System.in);
String[] no = {"bob", "john", "marty", "someoneelse",};
System.out.println("What is your name? ");
String check = input.nextLine();
if(check ~= "bob" && check ~= "john" ETCETCETC){
System.out.println("Welcome!");
}else{
System.out.println("Error.");
}
我写了ETCETC,因为很明显我打算放在那里。
我的问题是,如果有一种方法可以检查该数组而不列出所有这样的名称,因为否则它将是效率低下的代码。
答案 0 :(得分:4)
它不一定比迭代你要检查的所有值更有效,但是你可以用更少的代码来做到这一点。
将您的选择转换为ArrayList
并使用ArrayList.contains
:
if (Arrays.asList(no).contains(check))
System.out.println("Welcome!");
或者,检查列表中是否存在值 :
if (!Arrays.asList(no).contains(check))
System.out.println("Error!");
答案 1 :(得分:2)
如果您不想将数组no
转换为List
TreeSet
或boolean found = false;
for (String n : no) {
if (n.equals(check)) {
found = true;
break;
}
}
if (found) {
System.out.println("Welcome, " + check + "!");
} else {
System.out.println("Error.");
}
pb2q proposed,则可以随时使用jbx proposed:
TreeSet
这个解决方案有一个明显的缺点,即找到一个元素的时间是O(n)(最坏的情况),而List
(它是一个红黑树)保证O(log(n)) 。我不确定不同ArrayList
的时间复杂度是多少。对于~=
,它似乎也是O(n)。
关于您的代码的旁注:如果!=
意图是{{1}},那么您将陷入很多麻烦之中。阅读foreach
loop以避免混淆和严重错误。
答案 2 :(得分:1)
为了获得有效的实现,您应该使用不同的数据结构。您应该使用由二叉搜索树支持的内容而不是数组。然后搜索它变为O(log n),这比检查每个条目更快。
您可以简单地将数组放入TreeSet
,如下所示:
Set<String> set = new TreeSet<String>(Arrays.asList(no));
或者更好的是,首先在TreeSet
中填充它们,而不是数组。
然后检查您想要的字符串是否不在Set
中:
if (!set.contains(check)) { ...
显然,这只有在您需要在程序中多次执行此检查时才有用,因为您仍然需要通过列表一次将它们放入TreeSet
。
你也可以使用其他的set实现(比如Shahzeb建议的HashSet
,这更快,因为它由哈希表支持),具体取决于数组的大小和你需要做的操作除了这个特定的搜索。
答案 3 :(得分:1)
这可以使用Grovers Algorithm在O(sqrt n)中完成。我发现量子JVM作为读者的练习。