假设每个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.还有其他办法吗?如果是这样,它与上述方法相比如何?
答案 0 :(得分:5)
一般来说,你的方法很好。但是,您可以使用单流级联来实现。与原始方法相比,这可以为您节省一次迭代。
另请注意,现在我们使用名为 NIO 的Javas新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)
将INSERT INTO <TABLENAME>(COLUMN1, COLUMN2, COLUMN3, COLUMN4)
VALUES
(VALUE1,VALUE2, VALUE 3,VALUE 4);
收集到一个数组中。
答案 1 :(得分:2)
T[] array = Arrays.stream(br.readLine().split("\\s"))
.map(s -> new T(Integer.parseInt(s)))
.toArray(T[]::new)
编辑:注意到您使用了不同的分隔符