【问题标题】:What is the most effective method to input an array in Java?在 Java 中输入数组最有效的方法是什么?
【发布时间】:2013-04-28 07:46:20
【问题描述】:

我需要读取存储在文本文件单行中的数组。 到现在为止是这样的:

BufferedReader in = /*hook it to the file input stream via an InputStreamReader  */
String[] input = in.readLine().split(" ");
for (int i = 0; i < input.length; i++) 
     array[i] = Integer.parseInt(input[i]);

在这里,我不必要地使用了字符串数组。如何删除这个多余的步骤?

【问题讨论】:

  • 这是一个灾难性的性能问题吗?你想避免使用String#split
  • 读取磁盘上的文件比拆分字符串、实例化字符串数组并将每个元素转换为整数要慢几个数量级。这样做你不会获得任何有意义的东西。这就像在 2,000 英里的旅行后,使用跑鞋从汽车步行 10 米到您家。过早的优化是万恶之源。使用干净且可维护的代码,并仅在必要时进行优化。

标签: java arrays performance input inputstream


【解决方案1】:

如果您可以使用 InputStreamScanner 类,您可以执行以下操作:

Scanner scanner = new Scanner(inputStream);
List<Integer> list = new ArrayList<Integer>();
while(scanner.hasNext()) {
    list.add(scanner.nextInt());
}

【讨论】:

    【解决方案2】:
    BufferedReader in = /*hook it to the file input stream via an InputStreamReader  */
    String input = in.readLine();
    StringBuilder sb = new StringBuilder();
    List<Integer> list = new LinkedList<>(); //yours array equivalent
    for (int i = 0; i < input.length; i++) {
        char ch = input.charAt(i);
        if (ch == ' ') {
            list.add(Integer.parseInt(sb.toString()));
            sb.clear();
        } else {
            sb.append(ch);
        }
    }
    

    这样你就不需要创建冗余数组了。我认为它与 split() 方法的作用非常相似,但它不需要处理正则表达式,因此在这种情况下性能应该会更好。

    【讨论】:

    • 为了改进,您可以存储前一个 ' ' 字符的 (int) 索引(或最初为 0),而不是保留 StringBuilder 和 Integer.parseInt(input.substring(previous,i)) .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 2019-09-25
    • 2015-11-08
    • 2021-07-24
    • 2011-07-13
    • 1970-01-01
    • 2020-09-07
    相关资源
    最近更新 更多