【问题标题】:Putting each element of line to an array in java将行的每个元素放入java中的数组
【发布时间】:2017-01-07 14:44:44
【问题描述】:

我有一个 txt 文件,我需要将行的每个元素(字符串、空格)放入一个数组中。

示例:

1 行“嘿,1 天 \n”

2 /// 等

第一行的输出:["H" "e" "y" "," " " "1" "d" "a" "y"]

哪种方式最适合?使用 split 和 string 或者可能对 char 类型进行操作?

【问题讨论】:

  • 你不能只用string.toCharArray
  • 你的意思是把整行变成一个字符串,然后用这个方法?
  • 读取文件有问题吗?还是获取字符串的字符?

标签: java arrays string split


【解决方案1】:

为什么不直接在字符串上调用String#toCharArray

如果您仍然使用nextLine,读者将截断换行符。

类似:

try(BufferedReader r = new BufferedReader(new FileReader("topSecretDocs.txt"))) {
    for(String line = r.readLine(); line != null; line = r.readLine()) {
        char[] chars = line.toCharArray();
        System.out.println("Split line to " + Arrays.toString(chars));
    }
} catch(IOException e) {
    dealWithException();
}

编辑:请注意,您可能希望使用String#charAt 循环遍历字符串,因为不需要复制字符数组,尤其是对于非常大的字符串。

编辑 2:这是一个非常糟糕的基准。

static long time(Runnable r) {
    long start = System.nanoTime();
    r.run();
    return System.nanoTime() - start;
}

static int cs = 0;

public static void main(String[] args) {
    char[] bigString = new char[100000];
    Arrays.fill(bigString, 0, bigString.length / 4, 'A');
    Arrays.fill(bigString, bigString.length / 4, bigString.length / 2, 'B');
    Arrays.fill(bigString, bigString.length / 2, bigString.length * 3 / 4, 'C');
    Arrays.fill(bigString, bigString.length * 3 / 4, bigString.length, 'D');
    String s = new String(bigString);
    float avgCopy = 0, avgLoop = 0;
    final int times = 100000;
    for(int i = 0; i < times; i++) {
        avgLoop += time(() -> {
            cs = 0;
            for(int j = 0; j < s.length(); j++)
                cs += s.charAt(j) == 'C' ? 1 : 0;
        });
    } avgLoop /= times;
    for(int i = 0; i < times; i++) {
        avgCopy += time(() -> {
            char[] chars = s.toCharArray();
            cs = 0;
            for(char c : chars)
                cs += c == 'C' ? 1 : 0;
        });
    } avgCopy /= times;
    System.out.println("copy: " + avgCopy + " ns");
    System.out.println("loop: " + avgLoop + " ns");
    System.out.println("There were (obviously) " + cs + " Cs in that string.");
}

我明白了:

copy: 70984.336 ns
loop: 40534.63 ns

所以,大约快了一半。您是否愿意称其为重大差异,我将由您决定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    相关资源
    最近更新 更多