【问题标题】:Android reading text file and splittingAndroid读取文本文件并拆分
【发布时间】:2011-07-29 07:00:08
【问题描述】:

我正在尝试读取包含整数的文本文件并将它们存储到二维数组中。 问题是分裂。 我可以阅读:

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]);
        }
    }

所以我尝试使用分隔符,但它没有挂起并告诉我类型不匹配? 读取文件时拆分整数有什么解决办法?

【问题讨论】:

  • 把这一行 if(mScanner.hasNext()) 放在 mapArray[i][j] =scanner.nextInt();可能有用,也提供你的 logcat
  • 07-29 03:29:27.569: 错误/AndroidRuntime(5933): 致命异常: GLThread 10 07-29 03:29:27.569: 错误/AndroidRuntime(5933): java.util.InputMismatchException 07-29 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: 错误/AndroidRuntime(5933): 在 java.util.Scanner.nextInt(Scanner.java:1337)
  • 你试过我上面评论中提到的方法吗
  • 是的,我有。似乎没有改变一件事=/

标签: java android arrays multidimensional-array


【解决方案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
}

【讨论】:

  • 我不熟悉 Pattern 和 Matcher,如果可能的话,我想坚持我正在使用的东西。
  • 这只是一种基于正则表达式在文本中搜索模式的简单而强大的方法。
【解决方案2】:

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

[编辑]

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

【讨论】:

  • 文件实际上是这样的:0,0,0,0,0,1,1,1,然后换行并重复。我认为这与新线路有关?
【解决方案3】:

根据您的目的,您可以将文件中的每一行作为字符串读取, 然后拆分。

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

这样更容易将每个 Array 元素映射到目标数组。
而且你需要 Integer.parseInt() 来获取整数值。

【讨论】:

  • 速度差别大吗?
  • 对不起,我从来没有测试过。但由于 Alex Answer 编译了一次正则表达式,他的代码可能会更快。
【解决方案4】:

想出用这个作为我的分隔符:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-23
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多