2011-07-29 200 views
1

我想读取包含整数的文本文件并将它们存储到2d数组中。 问题在于分裂。 我可以读:Android读取文本文件和拆分

0 0 0 
0 1 0 
0 0 0 

就好任何数字0-9,但我有一个数字超过9(10,100,1000)。 我的方法:

int[][] mapArray = new int[11][8]; 
    AndroidFileIO file = new AndroidFileIO(context.getAssets()); 
    InputStream is = null; 
    try { 
     is = file.readAsset("maps/map.txt"); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     Log.d("android", "could not load file"); 
    } 
    Scanner scanner = new Scanner(is); 
    scanner.useDelimiter(","); 
    for (int i = 0; i < 11; i++) { 
     for (int j = 0; j < 8; j++) { 
      mapArray[i][j] = scanner.nextInt(); 
      Log.d("android", "" + mapArray[i][j]); 
     } 
    } 

所以我试图用一个分隔符,而不是它挂起,并告诉我,我得到一个类型不匹配? 读取文件时分裂整数的任何解决方案?

+0

把这个行,如果(mScanner.hasNext())之前mapArray [i] [j] = scanner.nextInt();可能工作,也提供您的logcat – ingsaurabh

+0

07-29 03:29:27.569:错误/ AndroidRuntime(5933):致命例外:GLThread 10 07-29 03:29:27.569:错误/ AndroidRuntime(5933):java.util .InputMismatchException 07:03:29:27.569:ERROR/AndroidRuntime(5933):at java.util.Scanner.next(Scanner.java:1025) 07-29 03:29:27.569:ERROR/AndroidRuntime(5933) :at java.util.Scanner.nextInt(Scanner.java:1373) 07-29 03:29:27.569:ERROR/AndroidRuntime(5933):at java.util.Scanner.nextInt(Scanner.java:1337) – semajhan

+0

have你尝试了我在上面评论 – ingsaurabh

回答

0

想通了使用此作为我的分隔符:

scanner.useDelimiter("[\\s,\r\n]+"); 
0

看起来像这里你使用的','作为分隔符,但在你提到的问题中的输入数字之间有空格。所以scanner.nextInt()正试图将空格字符转换为整数,因此类型不匹配。

[编辑]

那么你的新行字符正在被scanner.nextInt()读取。添加支票'\n' ,并在阅读字符时忽略它。

+0

该文件实际上是这样的:0,0,0,0,0,1,1,1,然后新的行和重复。我认为这与新线有关? – semajhan

1

您可以使用正则表达式来检索数字:

final Pattern PATTERN = Pattern.compile("(\\d+)"); 
final Matcher matcher = PATTERN.matcher(content); 
while (matcher.find()) { 
    final String numberAsString = matcher.group(0); 
    final Integer number = Integer.valueOf(numberAsString); 
    //do something with number 
} 
+0

我对模式和匹配器不熟悉,并且想尽可能坚持使用我所使用的模式。 – semajhan

+0

这只是一种基于正则表达式搜索模式文本的简单且强大的方法。 –

+0

似乎我可以使用这个,如果当我阅读文本。 – semajhan

0

取决于你的目的,你可以读取文件中的每一行作为一个字符串, 然后把它分解。

String line = bufferedReader.readLine(); // line is something like "1 2 3" 
String[] row = line.split("\\s+");   // got array ["1", "2", "3"] 

然后,更容易将每个数组元素映射到目标数组。
而且你需要Integer.parseInt()来获得整数值。

+0

速度有很大差异吗? – semajhan

+0

对不起,我从来没有测试过。但由于Alex Answer编译一次正则表达式,他的代码可能会更快。 – hanung