【问题标题】:Convert a string to int in Java without allocating a String在Java中将字符串转换为int而不分配字符串
【发布时间】:2015-01-28 04:56:00
【问题描述】:

我有几千行的文本文件,类似这样:

0000:0010:1111:3000
0003:0010:1113:3000
0004:0010:1188:3009

以此类推,其中数据将被解析为整数。

最明显的方法是使用Integer.parseInt(String)。但是,它需要一个String,并且由于Strings 是不可变的,我们必须一次又一次地分配Strings 才能将它们转换为整数。

它将在移动设备上运行,分配一个字符串并让 GC 运行需要相当大的努力。

我希望能够有像parseInt(char[] chars, int offset, int length) 这样的方法,这样我们就不需要进行分配了。那可能吗?标准 Java/JDK/Android 库中是否有任何实现可以做到这一点?

【问题讨论】:

  • 是什么让您认为分配char[] 会比分配String 更有效?它们都是对象。
  • @ApproachingDarknessFish 整个文件或行可以放入单个char[],但我们需要多个String 对象来将值解析为整数。

标签: java string integer parseint


【解决方案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.
}

【讨论】:

  • 虽然这避免了显式的字符串分配,但 OP 可能希望对 Scanner 进行一些性能测试并使用正则表达式。我的猜测是检查if ((theChar &lt; '0') || (theChar &gt; '9')) (或类似的)会快得多。另外,我想知道Scanner.nextInt() 等...是否在内部分配了一个字符串-似乎很可能,但我没有检查源代码。
  • 附录:Scanner.hasNextInt() 似乎创建了一个新字符串,但您必须真正按照代码进行确认。
【解决方案2】:

从 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;
}

您可以为数组长度添加一些安全检查,并根据需要确保字符是真正的数字。

【讨论】:

    【解决方案3】:

    如果您真的那么在意性能,则必须编写自己的代码来解析整数。例如

    public static int parseInt(String s, int startPos, int len) {
      // code omitted, it would be simple
    }
    

    String s 是您的整个文件(或者可能是其中的一行)。搜索行尾和冒号并获取您的号码。或者按照您的想法使用 char[] 。我不知道有一个内置的 Java 类可以做到这一点,但代码很简单——你在学校用 Java 1 学到的东西。

    【讨论】:

      猜你喜欢
      • 2013-11-03
      • 1970-01-01
      • 1970-01-01
      • 2012-10-02
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      • 2013-03-02
      • 2011-10-02
      相关资源
      最近更新 更多