【问题标题】:Java, reading numbers from txt files with special symbols into two dimensional array of integersJava,将带有特殊符号的txt文件中的数字读入二维整数数组
【发布时间】:2015-01-28 20:01:09
【问题描述】:

所以,首先,我将尝试解释我要完成的工作。我是java新手,我愿意学习它。问题:

假设我有一个 txt 文件,里面有这样的内容:

模式是:| a b |,当 a 是 ID 而 b 是实际数字时。我已经阅读了 Java 中的 Scanner、FileReader 和 BufferedReader 类,我尝试使用它们从文件中恢复整数并将它们保存到我的两个整数数组([2][1000])中。 [0][0-999] 是 ID,1[0-999] 是实际数字。现在是我坚持的那一刻 - 我可以读取前两个零,但是我不知道如何跳过 |象征。

我现在的代码:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;


public class ShortSearching {
    public static void main(String[] args) {

        int[] tall = new int[100];
        int i = 0, k = 0;
        Tab tablica = new Tab();
        File textFile = new File("byteObs.txt");
        try (Scanner scanner = new Scanner(textFile)) {
            while (scanner.hasNextInt()) {
                k++;
                tall[i++] = scanner.nextInt();
                System.out.println(tall[i]);
                if (k == 2) {
                    scanner.findInLine("|");
                    scanner.skip("|");
                    k = 0;
                }
            }

        } catch (FileNotFoundException e) {
            System.out.println("File not found: " + textFile.toString());
            //e.printStackTrace();
        }



        /*String byteObs = "byteObs.txt";
        File textFile = new File(byteObs);
        Scanner input = new Scanner(textFile);
        //short[] tabID,tabVal = new short[1000];
        byte k = 0;

        while (input.hasNextLine()) {


            for (int i = 0; i <= 999; i++) {
                for (int j = 0; j <= 999; j++) {
                    if (k != 2) {
                        if (input.hasNextShort()) {
                            //matrix[i][j] = input.nextShort();
                            //System.out.printf("%d ", matrix[i][j]);
                            k++;
                        }
                    }
                    else {
                        input.skip("|");
                        k=0;
                    }
                }
            }


        }
        input.close(); */
    }}

我尝试了多种方式,其中一些无法粘贴,因为它们已被删除。如果有人至少能指出我应该阅读的方法以便能够跳过这个,我将不胜感激我的文本文件中的符号。

PS。我知道 for 循环的编号是错误的,我会在修复跳过符号的东西时更改它们。

编辑 http://wklej.org/id/1543739/

这是全文。

【问题讨论】:

  • 您能否edit 提出您的问题,而不是发布存储在文件中的实际文本数据,以便我们在为您的问题创建解决方案时使用它?

标签: java arrays java.util.scanner bufferedreader filereader


【解决方案1】:

Scanner 在其许多方法中都需要表示正则表达式 (regex) 的模式。在 skip 方法的情况下也会发生这种情况,但在正则表达式中 | 是表示 OR 运算符的元字符。为了使它简单的文字,您需要通过在它之前添加 \ 来对其进行转义(请记住,要在 String 中创建 \ 文字,您还需要使用另一个 \ 对其进行转义)。

所以代表|字符的正则表达式是\|,需要写成字符串"\\|"

另一个问题是skip 需要正则表达式,它需要匹配需要跳过的整个部分,并且这部分必须恰好出现在扫描仪光标的位置之后,所以对于像这样的数据

1 |

当我们调用nextInt() 时,光标将设置在1 之后(我会用I 标记它)

1I |

所以我们要跳过的模式是space+|

最后一个问题是您的文件在所有行中都没有正确的值(它的行仅包含
| |,我们将无法使用nextInt(),因为下一个元素不会是 int。在这种情况下,我们可以使用hasNextInt() 简单地测试该行是否以整数开头,如果它没有读取,则通过调用nextLine() 来处理其内容而不使用它。

所以你的代码看起来像

File textFile = new File("input.txt");
try (Scanner sc = new Scanner(textFile)) {
    while (sc.hasNextLine()) {
        if (sc.hasNextInt()) {
            System.out.println("id    = " + sc.nextInt());
            System.out.println("value = " + sc.nextInt());
            if (sc.hasNext("\\|"))
                sc.skip(" \\|");
        } else {
            sc.nextLine(); // skip line if it doens't contain more integers
        }
    }
} catch (FileNotFoundException e) {
    System.out.println("File not found: " + textFile);
}

【讨论】:

  • 不客气 :)。无论如何,由于您是 Stack Overflow 的新手,您可能应该阅读有关 accepting answer mechanism 的信息。
  • 好吧,谢谢 :D 我一看到这个就接受了答案,抱歉耽搁了。
猜你喜欢
  • 2021-11-23
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 2014-04-06
  • 1970-01-01
相关资源
最近更新 更多