2

我有一个数字 L1 的列表作为字符串(例如“2443”)。我有另一个这样的列表 L2。我必须将 L1 中的每个数字与 L2 中的每个数字进行比较。L1 有大约 20,000 个数字(许多是重复的)。L2 有大约 600 个号码,都是独一无二的。

我无法获得任何其他格式的 L1 和 L2。

我想知道什么是最好的比较方法-

  1. 通过 Long.parseLong() 将所有数字转换为 Long 然后比较?
  2. 比较为字符串?

哪个会更有效率?我怀疑它可能几乎相同,因为在 1 中,我们必须解析字符串。那是开销。

编辑 -

我想出了一个例子。L1 是观看泰坦尼克号(浪漫)的 Netflix customer_ID 列表。L2 是观看史莱克(动画)的客户 ID 列表。如果至少 70% 的 L1 也看过史莱克,那就向他们推荐动画电影。另外,请注意,喜欢浪漫电影的人可能也喜欢动画电影。愚蠢的例子,但我认为这可能是有道理的。

计算 L1 中的元素个数,称其为 count。然后,我们检查 L1 的元素是否存在于 L2 中。如果为真,则将“找到”增加 1。计算找到/计数。如果 > 70%,向浪漫爱好者推荐动画电影。

4

4 回答 4

3

为什么不只是编码和检查?

测试代码

情况1

结果0.15第二;看这里

class Main
{
  public static void main (String[] args) throws java.lang.Exception
  {
     String a = "1235";
     String b = "1235";

     for(int i = 0; i< 20000*600; i++){
         if(a.equals(b));
     }
  }
}

案例2

结果3.96第二见这里

class Main
{
  public static void main (String[] args) throws java.lang.Exception
  {
     String a = "1235";
     String b = "1235";

     for(int i = 0; i< 20000*600; i++){
         if(Long.parseLong(a) == Long.parseLong(b));
     }
  }
}

笔记

在最坏的情况下测试(20000*600 循环)。在最佳实施中,您将需要 600*log(20000) 循环。

于 2013-05-29T17:49:34.353 回答
2

字符串比较按字典顺序进行比较:请参阅 docs。这意味着,“1000” < “8000” < “900” 根据 设置的顺序String.compareTo

因此,如果您想要正确的数字顺序,最好转换为整数。您可以使用Integer.parseInt(str).

于 2013-05-29T17:33:02.393 回答
2

这里有一些缺失的信息——你是否需要将这些信息转换为数字?你只是比较平等吗?如果唯一的一点是相等比较,并且实际上没有将数字作为 Long 获得,那么最好不要转换为数字:

如果没有转换为数字,在最坏的情况下,您将读取每个字符串 L1 * L2 次。但是在平均情况下,很多这些比较将被快速跟踪,因为字符串的大小会有所不同/不会仅在最后一个数字上有所不同。

通过转换为数字,您必须读取每个字符串(L1 * L2 次),然后在其上方添加 int 比较。

如果不能保证输入字符串是干净的(你能得到" 2"and "2"),这将变得更加复杂。

运行一个快速的轶事练习,生成 2 个随机列表,其中数字为字符串,这表明字符串比较要快得多(以毫秒为单位的数字,命中是相等数字的数量):

Compare Strings: 249.0363 (hits: 600)
Compare with Convert: 2505.3822 (hits: 600) 

这继续在多次运行中重现。

于 2013-05-29T17:34:22.680 回答
0

从示例中可以推断您正在比较字符串而不是数字(ID 可能是一个数字,但因为您不会使用它进行计算,所以将其视为一个字符串是有意义的)。

因此,我认为您应该使用字符串比较来比较是否相等,而不是先将其转换为数字。这种解决方案效率更高。

于 2013-05-29T17:52:37.923 回答