在Java中将字符串转换为int而不分配String

时间:2015-01-28 04:56:00

标签: java string integer parseint

我有数千行文本文件,类似于:

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库中是否有任何可以实现的实现?

3 个答案:

答案 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中学到的东西。