我有数千行文本文件,类似于:
0000:0010:1111:3000
0003:0010:1113:3000
0004:0010:1188:3009
等等,将数据解析为整数。
最明显的方法是使用Integer.parseInt(String)
。但是,它需要String
,并且由于String
是不可变的,我们必须一次又一次地分配String
来将它们转换为整数。
它将在移动设备中运行,其中分配字符串并让GC运行需要相当大的努力。
我希望能够拥有像parseInt(char[] chars, int offset, int length)
这样的方法,这样我们就不需要进行分配了。那可能吗?标准Java / JDK / Android库中是否有任何可以实现的实现?
答案 0 :(得分:1)
您可以使用Scanner
并致电useDelimiter(String)
来设置分隔符。像,
String str = "0000:0010:1111:3000\n" + "0003:0010:1113:3000\n"
+ "0004:0010:1188:3009";
Scanner sc = new Scanner(str);
sc.useDelimiter("[:|\\s]+"); // <-- one or more colon or whitespace
while (sc.hasNextInt()) {
System.out.printf("%04d%n", sc.nextInt()); // <-- format to 4 digits with
// leading zeros.
}
答案 1 :(得分:1)
从char数组解析int非常简单,这是演示代码:
public static int parseInt(char[] chars, int offset, int length) {
int r = 0;
for (int i = offset; i < offset + length; ++i) {
r *= 10;
r += chars[i] - '0';
}
return r;
}
您可以为数组长度添加一些安全检查,如果您愿意,请确保char确实是数字。
答案 2 :(得分:0)
如果您真的非常关心性能,那么您必须编写自己的代码来解析整数。 e.g。
public static int parseInt(String s, int startPos, int len) {
// code omitted, it would be simple
}
String s是您的整个文件(或者其中一行)。搜索行和冒号的结尾并获取您的数字。或者在你的想法中使用char []。我不知道有一个内置的Java类来做这个,但代码很简单 - 你在学校的Java 1中学到的东西。