Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中逐行比较文本文件_Java_File - Fatal编程技术网

在Java中逐行比较文本文件

在Java中逐行比较文本文件,java,file,Java,File,我试图比较Java文本文件中的行。 例如,有一个包含以下行的文本文件: temp1am 32.5pm33.5temp2am 33.5pm33.5temp3am 32.5pm 33.5上午4点下午31.5点35 a b c d e a是行的名称,b是常量(am),c是变量,d是常量(pm),e是另一个变量 它只会比较变量->temp1(c)到temp2(c),temp1(e)到temp2(e)等 当有两行或更多行具有相同的c(s)和e(s)时,它将抛出FormatException 从上面的示例文

我试图比较Java文本文件中的行。 例如,有一个包含以下行的文本文件:

temp1am 32.5pm33.5
temp2am 33.5pm33.5
temp3am 32.5pm 33.5
上午4点下午31.5点35

a b c d e

a是行的名称,b是常量(am),c是变量,d是常量(pm),e是另一个变量

它只会比较变量->temp1(c)到temp2(c),temp1(e)到temp2(e)等

当有两行或更多行具有相同的c(s)和e(s)时,它将抛出FormatException

从上面的示例文本文件中,由于temp1的c与temp3的c相同,temps1的e与temp3的e相同,因此它将引发FormatException

这就是我到目前为止所做的:

public static Temp read(String file) throws FormatException {
        String line = "";
        FileReader fr = new FileReader(fileName);
        Scanner scanner = new Scanner(fr);

        while(scanner.hasNextLine()) {
            String line = scanner.nextLine();
            System.out.println(line);
        }
        scanner.close();

        if () {
            throw new FormatException("Error.");

我怎样才能做到这一点呢?

因为我不想为你做家庭作业,让我开始:

while(scanner.hasNextLine()) {
    String line = scanner.nextLine();
    String[] partials = line.split(" ");

    String a = partials[0]; 
    //...
    String e = partials[4];    
}
我在一个
空间中拆分这行,因为在您的情况下,这是唯一可以拆分的内容。这给了我们5个单独的字符串(a到e)。您需要将它们保存在
字符串[][]
中,以供以后分析,但您应该能够自己弄清楚如何执行此操作


如果您仍有问题,请尝试处理此问题并更新您的问题。

由于我不想为您做家庭作业,请让我开始:

while(scanner.hasNextLine()) {
    String line = scanner.nextLine();
    String[] partials = line.split(" ");

    String a = partials[0]; 
    //...
    String e = partials[4];    
}
我在一个
空间中拆分这行,因为在您的情况下,这是唯一可以拆分的内容。这给了我们5个单独的字符串(a到e)。您需要将它们保存在
字符串[][]
中,以供以后分析,但您应该能够自己弄清楚如何执行此操作


试着处理一下这个问题,如果您仍然被卡住,请更新您的问题。

您需要拆分行以提取变量,并设置一个
以检查重复项,如下所示:

Set<String> ceValues = new HashSet<>();
while(scanner.hasNextLine()) {
    String line = scanner.nextLine();
    String[] values = line.split(" ");
    if (!ceValues.add(String.format("%s %s", values[2], values[4]))) {
        // The value has already been added so we throw an exception
        throw new FormatException("Error.");
    }
}
Set ceValues=new HashSet();
while(scanner.hasNextLine()){
字符串行=scanner.nextLine();
字符串[]值=行。拆分(“”);
如果(!ceValues.add(String.format(“%s%s”,值[2],值[4])){
//该值已被添加,因此我们抛出一个异常
抛出新的FormatException(“错误”);
}
}

您需要拆分行以提取变量,并设置
以检查重复项,如下所示:

Set<String> ceValues = new HashSet<>();
while(scanner.hasNextLine()) {
    String line = scanner.nextLine();
    String[] values = line.split(" ");
    if (!ceValues.add(String.format("%s %s", values[2], values[4]))) {
        // The value has already been added so we throw an exception
        throw new FormatException("Error.");
    }
}
Set ceValues=new HashSet();
while(scanner.hasNextLine()){
字符串行=scanner.nextLine();
字符串[]值=行。拆分(“”);
如果(!ceValues.add(String.format(“%s%s”,值[2],值[4])){
//该值已被添加,因此我们抛出一个异常
抛出新的FormatException(“错误”);
}
}

这里有一个示例,基本上包括:

  • 存储您的行的集合
  • 简单的模式匹配逻辑(有关更多信息,请参阅)
  • 声明
  • 一种递归检查方法
首先,我将制作一个表示行信息的简单POJO:

public class LineInfo {
    private String lineName;
    private String am;
    private String pm;

    public LineInfo(String lineName, String am, String pm) {
        this.lineName = lineName;
        this.am = am;
        this.pm = pm;
    }

    // getters and setters
}
其次,我需要一个模式来验证每一行并从中提取数据:

//                                   group 1         group 2  group3           group 4  group 5
//                                        v               v    v                    v    v
private static final String LINE_REGEX = "(\\w+)\\s+am\\s+(\\d+(\\.\\d+)?)\\s+pm\\s+(\\d+(\\.\\d+)?)";
private static final Pattern LINE_PATTERN = Pattern.compile(LINE_REGEX);
第三,我会像这样修改
read
方法(为了简单起见,我返回
void
):

publicstaticvoidread(字符串文件名)引发格式化异常{
//在某些数据结构中收集行(或者更好地收集行提供的信息),如列表
最终列表行=新的ArrayList();
//使用此语法,您的文件阅读器和扫描仪将自动关闭
try(FileReader fr=新文件读取器(文件名);Scanner Scanner=新扫描仪(fr)){
while(scanner.hasNextLine()){
最后一行字符串=scanner.nextLine();
最终匹配器匹配器=线\模式匹配器(线);
if(matcher.find()){
添加(新的LineInfo(matcher.group(1)、matcher.group(2)、matcher.group(4));
}否则{
抛出新的FormatException(“行\”+行+“\”无效。”);
}
}
//递归方法
比较线(行,0);
}捕获(最终IOE例外){
e、 printStackTrace();
//或者以某种方式处理它
}
}
私有静态无效比较线(列表行、int索引)引发FormatException{
//如果没有更多的线路返回
if(index==lines.size()){
返回;
}
final LineInfo line=lines.get(索引);
对于(inti=index+1;i
这里有一个示例,基本上包括:

  • 存储您的行的集合
  • 简单的模式匹配逻辑(有关更多信息,请参阅)
  • 声明
  • 一种递归检查方法
首先,我将制作一个表示行信息的简单POJO:

public class LineInfo {
    private String lineName;
    private String am;
    private String pm;

    public LineInfo(String lineName, String am, String pm) {
        this.lineName = lineName;
        this.am = am;
        this.pm = pm;
    }

    // getters and setters
}
其次,我需要一个模式来验证每一行并从中提取数据:

//                                   group 1         group 2  group3           group 4  group 5
//                                        v               v    v                    v    v
private static final String LINE_REGEX = "(\\w+)\\s+am\\s+(\\d+(\\.\\d+)?)\\s+pm\\s+(\\d+(\\.\\d+)?)";
private static final Pattern LINE_PATTERN = Pattern.compile(LINE_REGEX);
第三,我会像这样修改
read
方法(为了简单起见,我返回
void
):

publicstaticvoidread(字符串文件名)引发格式化异常{
//在某些数据结构中收集行(或者更好地收集行提供的信息),如列表
最终列表行=新的ArrayList();
//使用此语法,您的文件阅读器和扫描仪将自动关闭
try(FileReader fr=新文件读取器(文件名);Scanner Scanner=新扫描仪(fr)){
while(scanner.hasNextLine()){
最后一行字符串=scanner.nextLine();
最终匹配器匹配器=LINE_PATTERN.match