簡體   English   中英

將文本從文件存儲到數組

[英]Storing text from file to array

我有一個看起來像這樣的文本文件

{{"12","13","2","5"},
 {"14","14","1","4"},
 {"36","30","1","9"}}

我想將其存儲在數組中,上述相同文件中數組的大小為3x4,其中文件的每一行都有4個字符串,並且有3個這樣的行,因此數組應該看起來像

array[0][1]="12"
array[0][2]="13"
array[0][3]="2"
array[0][4]="5"
array[1][1]="14"
array[1][2]="14"
array[1][3]="1"
array[1][4]="4"
array[2][1]="36"
array[2][2]="30"
array[2][3]="1"
array[2][4]="9"

任何算法,植入,建議都將適用

您可以使用replaceAllsplit輕松完成此操作,如下所示:

public static void main(String[] args) throws Exception {
    final String input = "{{\"12\",\"13\",\"2\",\"5\"},{\"14\",\"14\",\"1\",\"4\"},{\"36\",\"30\",\"1\",\"9\"}}";
    final String[] rows = input.replaceAll("^\\{\\{|}}$", "").split("},\\{");
    final String[][] transformed = new String[rows.length][];
    for (int i = 0; i < rows.length; ++i) {
        final String[] columns = rows[i].replaceAll("^\"|\"$", "").split("\",\"");
        transformed[i] = new String[columns.length];
        System.arraycopy(columns, 0, transformed[i], 0, columns.length);
    }
    System.out.println(Arrays.deepToString(transformed));
}

輸出:

[[12, 13, 2, 5], [14, 14, 1, 4], [36, 30, 1, 9]]

如果使用List<List<String>>則它看起來更像:

public static void main(String[] args) throws Exception {
    final String input = "{{\"12\",\"13\",\"2\",\"5\"},{\"14\",\"14\",\"1\",\"4\"},{\"36\",\"30\",\"1\",\"9\"}}";
    final String[] rows = input.replaceAll("^\\{\\{|}}$", "").split("},\\{");
    final List<List<String>> transformed = new ArrayList<>();
    for (final String row : rows) {
        final String[] columns = row.replaceAll("^\"|\"$", "").split("\",\"");
        final List<String> transformedRow = new ArrayList<>();
        for (final String data : columns) {
            transformedRow.add(data);
        }
        transformed.add(transformedRow);
    }
}

按索引進行的循環次數更少,使代碼更清晰一些,但實際上, String處理才是痛苦的部分,因此您不會獲得太多收益。

我假設每一行只能以形式s包含一行

  • {{"a","b","c"},
  • {"a","b","c"},
  • {"a","b","c"}}

換句話說,每行可以以{{{開頭,並以},},結尾。

您需要做的是

  1. 逐行讀取文件,
  2. 刪除開頭和結尾的所有{}和引號,這樣您將只得到a","b","c
  3. ","上分割結果以獲取數組[a,b,c]
  4. 將該數組放入結果數組

您的代碼看起來像(代替String和文件中的數據,您可以使用File來代表文件的位置):

int rows = 3;
String[][] result = new String[rows][];

String data = "{{\"12\",\"13\",\"2\",\"5\"},\r\n"
        + " {\"14\",\"14\",\"1\",\"4\"},\r\n"
        + " {\"36\",\"30\",\"1\",\"9\"}}";
Scanner sc = new Scanner(data);

for (int i=0; i<rows; i++){
    String line = sc.nextLine();
    line = line.replaceAll("[\\s{]\\{\"|\"\\}[,}]", "");
    result[i]=line.split("\",\"");
}
sc.close();

for (String[] arr : result)
    System.out.println(Arrays.toString(arr));

輸出:

[12, 13, 2, 5]
[14, 14, 1, 4]
[36, 30, 1, 9]

如果您使用的是Java 8,則還可以使用流

List<String[]> rows = Files.lines(Paths.get("input.txt"))
    .map(s -> s.replaceAll("[\\s{]\\{\"|\"\\}[,}]", ""))
    .map(s-> s.split("\",\""))
    .collect(Collectors.toList());
    Function<String, String[]> breakIntoArray = (String s)->{
        s = s.replaceAll("}", "");
        s = s.replaceAll("\\{", "");
        s = s.replaceAll("\"", "");
        return s.split(",");
    };

    Path tradePath = Paths.get("xxx.txt");
    Files.lines(tradePath).map(breakIntoArray).collect(Collectors.toList());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM