我正在尝试检查特定字符串是Int
(或Boolean
还是Long
依此类推等等),但确实不需要< / strong>将其解析为Int
(或其他)。我可以想到两个选择。首先,要执行var.toInt.toString
或仅返回toInt
被调用的实际字符串(如果它是Int
)。虽然两者都很好,但我想知道前者与后者相比是否更加广泛。仅供参考,我不会以这种方式解析非常长的字符串,但我会查看数TB的数据。
答案 0 :(得分:8)
首先,回答确切的问题:
.toString
在我的机器上需要几十秒,其中细节当然取决于机器以及int的字符串表示的长度(最短和最长之间的差异为~2倍)。 .toInt
占用的时间较少(大约是toString
的1/2到3/4)。
这有关系吗?好吧,超过数TB的数据(主要是数字,我猜测),你将拥有数万纳秒或数万秒的数万亿。也许它确实如此;它需要额外的计算时间。
但那不会发生什么。如果您对不整数的内容使用toInt
,那么您将抛出异常。例外情况非常缓慢 - 通常至少需要几微秒。如果超过大约1/1000个假设的整数实际上没有整数,那么您将花费大量时间为解析异常创建大堆栈跟踪然后将它们丢弃。
您可以尝试使用正则表达式。这通常比仅进行解析便宜约10倍,但比抛出异常便宜10倍。除非你有几个额外的计算日来解决问题,否则仍然不是一个好的选择,特别是因为正则表达式只会告诉你它是否像 在范围内,所以你必须解析它(并捕获异常或进行繁琐的边界检查)。
因此,如果你真的希望它快速,你最终必须手动进行验证,通过字符串索引,使用charAt
抓取字符,等等。是的,这很痛苦。但是,如果你自己解析它,它将与单个.toInt
一样快。这是一个很难看的代码块。如果人们可能在其他字符集中有数字值,那么使用java.lang.Character.digit
通常是一种方法(你可以捕获-1返回和保释)。不要忘记处理积极和消极的不同(由于范围不同)。
附录:您可能认为java.util.Scanner
只是门票。它逐步执行数据并使用hasNextInt
方法。不幸的是,它的速度非常慢。
另请参阅What's the best way to check to see if a String represents an integer in Java?以获取问题的Java答案(其中没有一个是IMO的想法)。