比较数字字符串 - 首先转换它们或比较没有转换?

时间:2013-05-29 17:25:24

标签: java list

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

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

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

  1. 通过Long.parseLong()将所有数字转换为Long,然后比较?
  2. 比较为字符串?
  3. 哪个会更有效率?我怀疑它可能几乎相同,因为在1中,我们必须解析字符串。这是开销。

    编辑 -

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

    计算L1中元素的数量,称之为计数。然后,我们检查L2中是否存在L1元素。如果为true,则将'found'增加1.计算found / count。如果> 70%,向浪漫爱好者推荐动画电影。

4 个答案:

答案 0 :(得分:3)

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

<强> TestCode

案例1

结果0.15秒; see here

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.96see here

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)循环。

答案 1 :(得分:2)

字符串比较按字典顺序进行比较:see docs。这意味着,“1000”&lt; “8000”&lt;根据{{​​1}}设定的顺序“900”。

因此,如果您想要正确的数字顺序,最好转换为Integer。您可以使用String.compareTo

答案 2 :(得分:2)

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

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

转换为数字时,您必须阅读每一个字符串(L1 * L2次),然后在上面添加int比较。

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

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

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

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

答案 3 :(得分:0)

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

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