Java 比较数字字符串-先转换还是不转换就比较?
我有一个数字列表L1作为字符串(例如“2443”)。我还有另一个类似的清单。我必须将L1中的每个数字与L2中的每个数字进行比较。L1大约有20000个数字(许多是重复的)。L2大约有600个数字,都是唯一的 我无法以任何其他格式获取L1和L2 我想知道最好的比较方法是什么-Java 比较数字字符串-先转换还是不转换就比较?,java,list,Java,List,我有一个数字列表L1作为字符串(例如“2443”)。我还有另一个类似的清单。我必须将L1中的每个数字与L2中的每个数字进行比较。L1大约有20000个数字(许多是重复的)。L2大约有600个数字,都是唯一的 我无法以任何其他格式获取L1和L2 我想知道最好的比较方法是什么- 将所有数字转换为Long by Long.parseLong(),然后进行比较 作为字符串进行比较 哪个效率更高?我怀疑这可能是几乎相同的,因为在1中,我们必须解析字符串。那是开销 编辑- 我举了一个例子。L1是观看《泰坦尼
计数L1中的元素数,称为计数。然后,我们检查L2中是否存在L1元素。如果为true,则将“发现”增加1。计算发现/计数。如果>70%,向浪漫恋人推荐动画电影。字符串比较按字典顺序进行比较:。这意味着,根据
String.compareTo
设置的顺序,“1000”<“8000”<“900”
因此,如果您想要正确的数字顺序,最好将其转换为整数。您可以使用
Integer.parseInt(str)
此处缺少一些信息-您是否需要将这些信息转换为数字?你只是在比较平等吗?如果唯一的一点是相等比较,并且实际上没有得到足够长的数字,那么最好不要转换为数字:
在没有数字转换的情况下,在最坏的情况下,您将读取每个字符串L1*L2次。但是在一般情况下,这些比较中的很多都是快速进行的,因为字符串的大小不同,而不仅仅是最后一个数字
转换为数字时,您必须读取每个字符串(L1*L2次),然后在上面添加int比较
如果不能保证输入字符串是干净的(您可以得到“2”
和“2”
)
运行一个快速、有趣的练习,生成两个以数字为字符串的随机列表,结果表明字符串比较速度要快得多(以毫秒为单位的数字,点击数是相等数字的数量):
这将继续在多个运行中进行重新编程。为什么不进行编码和检查 TestCode 案例1 结果
0.15
2秒
注意
在最坏情况下测试(20000*600回路)。在最佳实现中,您将需要600*log(20000)个循环。从示例中可以推断,您正在比较字符串而不是数字(ID可能是一个数字,但由于您不会使用它进行计算,因此将其视为字符串是有意义的)
因此,我认为应该使用字符串比较来比较等式,而不是首先将其转换为数字。此解决方案更有效。比较并做什么?@TheNewIdiot-我不确定比较背后的目的在这种情况下是否相关。我想把这看作一项任务。这取决于:你是想让它们按数字顺序排列,还是按字母顺序排列?不过,你的两个案例的行为并不总是一样的。如果元素的位数不同怎么办?@ZongLi:那么你是说所有数字的位数都完全相同?这是唯一一种结果总是相同的情况。现在,只有平等才重要。我不认为我需要将它转换为long以便以后使用。我模拟了它,发现如果只需要相等,字符串比较确实要快得多。我只是使用了它。。但您可以使用计时器检入自己的ide
Compare Strings: 249.0363 (hits: 600)
Compare with Convert: 2505.3822 (hits: 600)
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));
}
}
}
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));
}
}
}