2014-07-13 58 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());