使用Java读取包含数组的文件

时间:2018-01-29 09:57:48

标签: java arrays file

我正在研究一种机器学习算法,它包括两部分训练和预测,我必须将训练结果保存在文件中,以便以后使用它们。 数组以这种方式声明:

List<int[][]> samples = new ArrayList<>();

以及我使用的文件:

BufferedWriter writer1 = new BufferedWriter(new FileWriter("results/samples.data"));
writer1.write(Arrays.deepToString(samples.toArray()));
writer1.close(); 

因此该文件包含多维数组,如图所示

File Array

我已经坚持如何阅读它并以正确的形式存储在变量内部并且在大多数情况下搜索的解决方案是逐行读取文件,这不是我的情况,因为那里没有换行

我在问是否有任何方法可以阅读该文件,或者是否有比我正在使用的文件更好的解决方案。

2 个答案:

答案 0 :(得分:1)

给出

[[[1,3][2,5]]
 [[4,8][3,1]]
 [[5,9][6,5]]]

我只会使用分隔符存储整数

1 3 ~ 2 5 | 4 8 ~ 3 1 | 5 9 ~ 6 5

使用简单的for循环或lambdas

可以很容易地编写和读取/解析

修改 似乎以这种方式工作:

public static void main(String[] arg) throws Exception {

    // NESTED ARRAYS EXAMPLE
    List<int[][]> nestedlist = Arrays.asList(
        new int[][] { new int[] {1, 3}, new int[] {2, 5} },
        new int[][] { new int[] {4, 8}, new int[] {3, 1} },
        new int[][] { new int[] {5, 9}, new int[] {6, 5} }
    );

    String s = makeStringForNestedArrays(nestedlist);
    System.out.println(s);

    List<Integer[][]> readNestedList = parseStringToNestedArrays(s);
    System.out.println(Arrays.deepToString(readNestedList.toArray()));


    // SIMPLE ARRAYS EXAMPLE
    List<Integer> simpleList = Arrays.asList(1, 3, 5, 6);

    s = makeStringForSimpleList(simpleList);
    System.out.println(s);

    List<Integer> readSimpleList = parseStringToSingleList(s);
    System.out.println(readSimpleList);

  }

  private static String makeStringForSimpleList(List<Integer> list) {
    return list.stream().map(String::valueOf).collect(Collectors.joining(" "));
  }

  private static List<Integer> parseStringToSingleList(String s) {
    return Arrays.stream(s.split(" ")).map(Integer::valueOf).collect(Collectors.toList());
  }

  private static String makeStringForNestedArrays(List<int[][]> list) {
    return list.stream().
        map(arrayOfArrays -> arrayOfArraysToString(arrayOfArrays))
        .collect(Collectors.joining(" | "));
  }

  private static List<Integer[][]> parseStringToNestedArrays(String s) {
    return Arrays.stream(s.split(" \\| "))
        .map(str -> stringToArrayOfArrays(str, " ~ ", " "))
        .collect(Collectors.toList());
  }

  private static String arrayToString(int[] array) {
    return Arrays.stream(array).mapToObj(String::valueOf).collect(Collectors.joining(" "));
  }
  private static String arrayOfArraysToString(int[][] arrayOfArrays) {
    return Arrays.stream(arrayOfArrays).map(array -> arrayToString(array)).collect(Collectors.joining(" ~ "));
  }


  private static Integer[] stringToArray(String s, String delimiter) {
    String[] a = s.split(delimiter);
    return Arrays.stream(a).map(Integer::valueOf).toArray(Integer[]::new);
  }
  private static Integer[][] stringToArrayOfArrays(String s, String delimiterLevel1, String delimiterLevel2) {
    String[] a = s.split(delimiterLevel1);
    return Arrays.stream(a).map(s1 -> stringToArray(s1, delimiterLevel2)).toArray(Integer[][]::new);
  }

答案 1 :(得分:1)

从文件中读取数组的常用方法是在第一行中指定数组的长度,后跟n行,其中n是长度。这样,您就知道分配的数组应该有多大,然后在for循环中读取n个下一行。对于2D数组,只需嵌套此方法,以便文件看起来像这样:

for array:

UserEntity author

创建一个这样的文件:

[[1, 2][3]]

如果您想概括N维数组的方法,只需在开头添加一行,指定维度。