2014-07-13 59 views
0

我有一個文本文件,它看起來像這樣存儲文本從文件到陣列

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

而且我要在陣列中存儲此 從上面的同一個文件數組的大小爲3×4 其中每個該文件的行具有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" 

任何算法,注入,建議將appliciated

+1

看起來像JSON數據,是嗎? –

+0

是的,它是JSON種類,但它是輸出我從另一個軟件得到,現在我想將它們存儲在數組中進行進一步處理 –

+0

@BoristheSpider這是無效的JSON。對於正確的json,花括號必須用方括號代替,因爲這些值沒有輔助鍵。 – danijoo

回答

0

您可以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處理,這是一個痛苦的部分,所以你收益不大。

0

我將假定每行可以包含在表單的

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

換句話說,每個線可以與{{啓動一個只有一行或{並以},},結尾。

你需要做的是通過線

  1. 讀取文件中的行,
  2. 刪除所有{}和引號,在開始和結束,所以你會在只得到a","b","c
  3. 拆分結果","獲取陣列[a,b,c]
  4. 將數組置於結果數組中

您的代碼可以像(而不是從文件,你可以使用文件數據字符串,它代表了文件的位置):

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()); 
0
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());