gpt4 book ai didi

java - 从文件流式传输 n 个整数列表以创建 n 个对象数组

转载 作者:搜寻专家 更新时间:2023-11-01 01:49:20 25 4
gpt4 key购买 nike

假设每个T对象都可以实例化为

T tobj = new T(//int value);

因此,要从一个由空格分隔的文件中的整数创建一个 T[ ] 数组,我执行以下操作:

 BufferedReader br;
FileReader fr;
int[] arr;
try{
fr = new FileReader(fo); // assume "fo" file name
br = new BufferedReader(fr);
arr = Arrays.stream(br.readLine().split("\\s")).mapToInt(Integer::parseInt).toArray();

}catch(SomeException e){//something else}

T[] tobjarr = new T[arr.length];
for(int i=0; i<arr.length; ++i)){
tobjarr[i] = new T(arr[i]);
}

1.上述方法在时间和空间使用方面是否高效?

2.还有其他办法吗?如果是的话,它与上述方法相比如何?

最佳答案

总的来说,您的方法没有问题。但是,您可以使用单流级联 来做到这一点。与您的原始方法相比,这为您节省了一次迭代

另请注意,如今我们使用名为 NIO 的 Java 新 I/O API 读取文件。一大优势是它提供Stream方法。例如 Files#lines返回文件所有行的流的方法,非常适合您的方法。

总而言之,这是完整代码:

String file = ...
Pattern separator = Pattern.compile("\\s");

try (Stream<String> lines = Files.lines(Paths.get(file))) {
T[] values = lines // Stream<String> lines
.flatMap(separator::splitAsStream) // Stream<String> words
.mapToInt(Integer::parseInt) // IntStream values
.mapToObj(T::new) // Stream<T> valuesAsT
.toArray(T[]::new);
} catch (IOException e) {
System.out.println("Something went wrong.");
}

请注意,此代码与您的略有不同,因为您的代码只会处理一行,而我的所有行。如果你不想要它,你可以改变它:

List<T[]> valuesPerLine = Files.lines(Paths.get(file))  // Stream<String> lines
.map(separator::splitAsStream) // Stream<Stream<String>> wordsPerLine
.map(lineStream -> {
return lineStream // Stream<String> words
.mapToInt(Integer::parseInt) // IntStream values
.mapToObj(T::new) // Stream<T> valuesAsT
.toArray(T[]::new);
}) // Stream<T[]> valuesPerLine
.collect(Collectors.toList());

与您的原始方法的主要区别在于我们可以轻松地转换 IntStream进入Stream<T>通过使用 mapToObj(T::new) (或者只是 map 如果它是常规流而不是 IntStream )它将元素传递给构造函数。之后我们收集 Stream<T>使用 toArray(T[]::new) 进入数组.

关于java - 从文件流式传输 n 个整数列表以创建 n 个对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47800354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com