如何有效地检查阵列? (JAVA)

时间:2015-07-19 23:43:48

标签: java

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,因为很明显我打算放在那里。

我的问题是,如果有一种方法可以检查该数组而不列出所有这样的名称,因为否则它将是效率低下的代码。

4 个答案:

答案 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 TreeSetboolean 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作为读者的练习。