【问题标题】:Most efficient/faster way of checking if string belongs to array [closed]检查字符串是否属于数组的最有效/更快的方法[关闭]
【发布时间】:2015-12-01 09:46:41
【问题描述】:

我想在 Java 和 JavaScript 中找到检查字符串是否属于数组的最有效/最快的方法。
比如我要查找字符串"="是否属于数组{"+", "-", "=", "*", "/", "!"}

在 Java 中的一种方法是(省略 main 方法)

String[] symbols = {"+", "-", "=", "*", "/", "!"};
String equalTo = "=";
for(String i: symbols) {
  if(equalTo.equals(i)) {
    System.out.print(equalTo + " belongs to symbols.");
  }
}

我想知道是否有一种方法可以在 Java 和 JavaScript 中为我工作。

我用两种语言问这个的原因是我想看看用 Java 还是 JavaScript 更容易。

【问题讨论】:

  • 你使用的是 java 8 吗?
  • Java 和 Javascript 是两种完全不同的语言,为什么要针对不同语言的特定问题使用完全相同的代码?
  • @Dici 我需要这两种语言的
  • 然后写两个函数...
  • 这是一个非常基本的算法,你不在乎它在 Java 或 JS 中是否“更简单”(你肯定是指“更短”),它只是一个你可以在 5 秒内编写的代码任何一种语言。

标签: javascript java arrays performance


【解决方案1】:

在 Java 中,您可以使用 Arrays.asList(yourArray).contains(yourValue)。如果你使用 jQuery,你可以使用$.inArray(yourValue, yourArray)

【讨论】:

  • 两个函数都返回布尔值吗?
  • 为此创建一个数组列表很昂贵。为此依赖库很昂贵
  • Java 包含返回布尔值。 inArray 返回数组中值的索引(如果包含它必须大于-1)。
  • 它可能会耗费内存,但不会耗费时间(如果我们将此解决方案与简单的 for 循环与 equals 进行比较)。如果 Kritixi Lithos 已经在项目中使用过 jQuery,他可以使用它。
  • @Dici Java 代码不会创建 java.util.ArrayList,也不会复制数组。 Arrays.asList(..) 只是将给定数组包装到由该数组支持的List 中,因此它是恒定时间且非常快的。 (这就是为什么,例如,你可以在结果列表中设置一个已经存在的元素,但你不能添加一个元素——因为你可以设置一个数组元素,但你不能向数组添加新的索引。 )
【解决方案2】:

用 JavaScript 回答您的问题:How do I check if an array includes an object in JavaScript?

例如如果您搜索完全匹配,您可以使用:

["=", "+", "-"].indexOf("=") // => 1

【讨论】:

【解决方案3】:

查看一个字符串是否在一个字符串集合中的最有效的方法是这个集合已经被散列了。例如,如果你在 Java 中有一个 HashSet<String>,你可以只使用 .contains(String) 方法,它在 O(1) 中运行。

如果您的集合存储为 ArrayList<String> 或数组,则需要 O(n) 时间来检查字符串是否在集合中(也可以使用 .contains(String) 方法)。

将列表或数组转换为集合需要 O(n) 时间,但比检查单个元素是否在列表中需要更长的时间。

所以,总结:

  • 如果您只想检查一个元素是否在集合中,只需遍历您显然已经拥有的列表,并检查该元素是否在列表中。对于数组,在 Java 中只需使用 Arrays.asList(symbols).contains(equalTo),在 JavaScript 中使用 symbols.contains(equalTo)
  • 如果要检查很多元素是否在集合中,那么最好先将集合变成集合。在 Java 中,做类似的事情

    HashSet<String> set = new HashSet<String>();
    set.addAll(Arrays.asList(symbols));
    

    之后你可以set.contains(equalTo)

    对于 JavaScript,这有点烦人,但我想到的第一件事是这样的:

    var set = Object.create(null);
    for (var i in symbols) {
        set[i] = true;
    }
    

    然后,您可以检查checkTo in set

对不起,回答太长了,但你问的是效率吗?

【讨论】:

  • 集合!= 数组。
  • 数组是一个集合(显然不是 Java 方面的,这就是我说集合而不是集合的原因)
  • 另外,set 的初始化不使用HashSet(Collection&lt;? extends E&gt;)。这个构造函数是不好的做法吗?那我不知道它为什么会在那里。
  • 构造函数一点也不坏,但我经常组合集合,所以我更喜欢将addAll方法看作一个单独的步骤。 HashSet&lt;String&gt; set = new HashSet&lt;String&gt;(Arrays.asList(symbols)) 同样有效。
【解决方案4】:

执行此操作的“最佳”方式实际上取决于要匹配的值的数量以及您需要执行此操作的频率。

如果列表很长,而且您经常这样做,最好创建一个 set/map/associate-array 以进行快速查找,或者对值列表进行排序并执行二进制搜索。在 Java 中,这将是 Set&lt;String&gt;Arrays.binarySearch()

但是,在您的情况下,列表很短,所以像您这样进行顺序搜索就可以了。

但除此之外,您的值都是单字符,因此有一个解决方案恰好是 Java 和 JavaScript 的完全相同的解决方案:indexOf()

在 Java 中:

if ("+-=*/!".indexOf(value) != -1) {
    // found
}

在 JavaScript 中:

if ("+-=*/!".indexOf(value) != -1) {
    // found
}

诡异吧?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 2018-05-04
    • 2017-03-29
    • 1970-01-01
    相关资源
    最近更新 更多