【问题标题】:How to find the duplicate in text file in Java如何在Java中查找文本文件中的重复项
【发布时间】:2021-04-08 11:01:13
【问题描述】:

我正在用 Java 设计一个编译器。在此,我从文本文件中读取输入,并在有条件的情况下将该输入存储到符号表中。现在我想检查重复项,然后不想将重复项数据添加到表中。

我使用了 Set,我知道它不允许重复,并且程序没有将重复的数据添加到表中,但它也在打印 Data Inserted,而我没有。我想当文本中存在重复数据时,程序应该说数据已经存在

以下是将数据添加到表中的代码。

case 10:
                    if(str.contains("=")){
                        System.out.println("Token name = otop");
                        System.out.println("Attribute value = ASN");
                        
                        if(str.startsWith("=")){
                            break;
                        }
                        else{
                        try{
                        String a[] = str.split(" ");
                        type = a[0];
                        lexeme = a[1];
                        value = a[3];
                        if(value.endsWith(";")){
                        value = value.replace(";", "");
                        if(type.contains("int") && value.matches("[-+][0-9]*")){
                            tabledata.add(lexeme+"\t\tid\t\t"+type+"\t\t"+value);
                            System.out.println("Data Inserted in the table!");
                        }
                        else if(type.contains("float") && value.matches("[0-9].[0-9]*")){
                            tabledata.add(lexeme+"\t\tid\t\t"+type+"\t\t"+value);
                            System.out.println("Data Inserted in the table!");
                        }
                        else if(type.contains("string") && value.matches("\"[A-Z a-z 0-9]*\"")){
                            tabledata.add(lexeme+"\t\tid\t\t"+type+"\t\t"+value);
                            System.out.println("Data Inserted in the table!");
                        }
                        else if(type.contains("char") && value.matches("\'[A-Za-z0-9]\'")){
                            tabledata.add(lexeme+"\t\tid\t\t"+type+"\t\t"+value);
                            System.out.println("Data Inserted in the table!");
                        }
                        else{
                            System.out.println("ERROR: Type MissMatch!");
                        }
                        }
                        else if(!value.endsWith(";")){
                            System.out.println("\nERROR: ; expected on line number " +lineNumber.getLineNumber() + " in the text file");
                        }
                        }
                        catch(Exception e){
                            System.out.println("Error: Try to declare variale with spaces e.g int a = 5;");
                        }
                        }
                        break;
                    }

我得到的输出是:

f
l
o
a
t
 
a
 
=
 
5
.
5
;
Token name = otop
Attribute value = ASN
Data Inserted in the table!
f
l
o
a
t
 
a
 
=
 
5
.
5
;
Token name = otop
Attribute value = ASN
Data Inserted in the table!
----------------------------------------------------------------------------------

            --Symbol Table--
Lexeme      Token name   Type       Attribute value
a           id           float      5.5
----------------------------------------------------------------------------------

我该如何解决这个问题?作为参考,我附上下面的整个代码:

import java.io.FileReader;
import java.util.*;
import java.io.LineNumberReader;
import java.io.FileNotFoundException;
import java.io.IOException;

public class main {
   
    public static void main(String[] args) throws FileNotFoundException, IOException{
        LineNumberReader lineNumber;
       
        FileReader newFile = new FileReader( "C:/temp/sourcecode.txt");
        lineNumber = new LineNumberReader(new FileReader("C:/temp/sourcecode.txt"));
        
        Scanner scanFile = new Scanner(newFile);
        //Scanner scan = new Scanner(System.in);
        //char s;
        String str, lexeme, type, value;
        
        //String str1 = "\"[A-Za-z]*\"";
        Set<String> tabledata = new HashSet<>();
 
        while(scanFile.hasNextLine() && lineNumber.readLine() != null){
        str = scanFile.nextLine();
        //lexeme.add(str);
        if(!str.startsWith("//") && !str.startsWith("/*") && !str.endsWith("*/")) {
            
        for(int i =0; i<=str.length()-1 ; i++) {
            str = str.replace("\\s", "");
             str = str.replaceAll("\t", "");
             str = str.replaceAll("\n", "");
            System.out.println(str.charAt(i));
        }
       
            int OP = 0;
           
            switch(OP){
                case 0:
                    if(str.contains("<") && str.contains(">")){
                        System.out.println("Token name : relop");
                        System.out.println("Attribute value = NE");
                              
                        break;
                        
                    }
                case 1:
                    if(str.contains("<") && str.contains("=")){
                        System.out.println("Token name = relop");
                        System.out.println("Attribute value = LE");
                        break;
                    }
                   
                case 2:
                    if(str.contains(">") && str.contains("=")){
                        System.out.println("Token name = relop");
                        System.out.println("Attribute value = GE");
                        break;
                    }
                   
                case 3:
                    if(str.contains("<")){
                        System.out.println("Token name = relop");
                        System.out.println("Attribute value = LT");
                        break;
                    }
                case 4:
                    if(str.contains(">")){
                        System.out.println("Token name = relop");
                        System.out.println("Attribute value = GT");
                        break;
                    }
                case 5:
                    if(str.contains("==")){
                        System.out.println("Token name = relop");
                        System.out.println("Attribute value = EQ");
                        break;
                    }
                case 6:
                    if(str.contains("+")){
                        System.out.println("Token name = arop");
                        System.out.println("Attribute value = ADD");
                        break;
                    }
                case 7:
                    if(str.contains("-")){
                        System.out.println("Token name = arop");
                        System.out.println("Attribute value = SUB");
                        break;
                    }
                case 8:
                    if(str.contains("*")){
                        System.out.println("Token name = arop");
                        System.out.println("Attribute value = MUL");
                        break;
                    }
                case 9:
                    if(str.contains("/")){
                        System.out.println("Token name = arop");
                        System.out.println("Attribute value = DIV");
                        break;
                    }
                case 10:
                    if(str.contains("=")){
                        System.out.println("Token name = otop");
                        System.out.println("Attribute value = ASN");
                        
                        if(str.startsWith("=")){
                            break;
                        }
                        else{
                        try{
                        String a[] = str.split(" ");
                        type = a[0];
                        lexeme = a[1];
                        value = a[3];
                        if(value.endsWith(";")){
                        value = value.replace(";", "");
                        if(type.contains("int") && value.matches("[-+][0-9]*")){
                            tabledata.add(lexeme+"\t\tid\t\t"+type+"\t\t"+value);
                            System.out.println("Data Inserted in the table!");
                        }
                        else if(type.contains("float") && value.matches("[0-9].[0-9]*")){
                            tabledata.add(lexeme+"\t\tid\t\t"+type+"\t\t"+value);
                            System.out.println("Data Inserted in the table!");
                        }
                        else if(type.contains("string") && value.matches("\"[A-Z a-z 0-9]*\"")){
                            tabledata.add(lexeme+"\t\tid\t\t"+type+"\t\t"+value);
                            System.out.println("Data Inserted in the table!");
                        }
                        else if(type.contains("char") && value.matches("\'[A-Za-z0-9]\'")){
                            tabledata.add(lexeme+"\t\tid\t\t"+type+"\t\t"+value);
                            System.out.println("Data Inserted in the table!");
                        }
                        else{
                            System.out.println("ERROR: Type MissMatch!");
                        }
                        }
                        else if(!value.endsWith(";")){
                            System.out.println("\nERROR: ; expected on line number " +lineNumber.getLineNumber() + " in the text file");
                        }
                        }
                        catch(Exception e){
                            System.out.println("Error: Try to declare variale with spaces e.g int a = 5;");
                        }
                        }
                        break;
                    }
//                case 11:
//                    if(str.contains("'")){
//                        System.out.println("Token name = otop");
//                        System.out.println("Attribute value = PRN");
//                        break;
//                    }
                case 12:
                    if(str.contains(";")){
                        System.out.println("Token name = otop");
                        System.out.println("Attribute value = LNTR");
                            if(str.startsWith(";")){
                            break;
                        }
                        String p[] = str.split(" ");
                        type = p[0];
                        lexeme = p[1];
                        if(lexeme.endsWith(";")){
                        System.out.println(p[1]);
                        lexeme = lexeme.replace(";", "");
                        tabledata.add(lexeme+"\t\tid\t\t"+type+"\t\tNull");
                        System.out.println("Data Inserted in the table!");
                        }
                        else if(!lexeme.endsWith(";")){
                            System.out.println("\nERROR: ; expected on line number " +lineNumber.getLineNumber() + " in the text file");
                        }
                        break;
                    }
                case 13:
                    if(str.contains("{")){
                        System.out.println("Token name = otop");
                        System.out.println("Attribute value = LBRC");
                        break;
                    }
                case 14:
                    if(str.contains("}")){
                        System.out.println("Token name = otop");
                        System.out.println("Attribue value = RBRC");
                        break;
                    }
                case 15:
                   if(str.contains("begin")){
                        System.out.println("Token name = Keyword");
                        System.out.println("Attribute value = 1");
                        break;
                    }
                case 16:
                   if(str.contains("end")){
                        System.out.println("Token name = Keyword");
                        System.out.println("Attribute value = 2");
                        break;
                    }
                case 17:
                   if(str.contains("if")){
                        System.out.println("Token name = Keyword");
                        System.out.println("Attribute value = 3");
                        break;
                    }
                case 18:
                   if(str.contains("then")){
                        System.out.println("Token name = Keyword");
                        System.out.println("Attribute value = 4");
                        break;
                    }
                case 19:
                   if(str.contains("else")){
                        System.out.println("Token name = Keyword");
                        System.out.println("Attribute value = 5");
                        break;
                    }
                case 20:
                   if(str.contains("int")){
                        System.out.println("Token name = Keyword");
                        System.out.println("Attribute value = 6");
                        break;
                   }
                case 21:
                   if(str.contains("float")){
                        System.out.println("Token name = Keyword");
                        System.out.println("Attribute value = 7");
                        break;
                   }
                case 22:
                   if(str.contains("char")){
                        System.out.println("Token name = Keyword");
                        System.out.println("Attribute value = 8");
                        break;
                    }
                case 23:
                   if(str.contains("string")){
                        System.out.println("Token name = Keyword");
                        System.out.println("Attribute value = 9");
                        break;
                    }
                case 24:
                        if(str.matches("[A-Za-z_][A-Za-z_0-9_]*")){
                            System.out.println("Token name = id");
                            tabledata.add(str+"\t\tid\t\tIdentifier\tNull");
                            System.out.println("Data Inserted in the table!");
                            break;
                    }
                case 25:
                    if(str.matches("[+0-9]*")){
                        System.out.println("Token name = uint");
                        tabledata.add("Null\t\tuint\t\tint\t\t"+str);
                        System.out.println("Data Inserted in the table!");
                        break;
                    }
                case 26:
                    if(str.matches("\"[A-Z a-z]*\"")) {
                        System.out.println("Token name = sliteral");
                        tabledata.add("Null\t\tsliteral\tstring\t\t"+str);
                        System.out.println("Data Inserted in the table!");
                        break;
                    }
                case 27:
                    if(str.matches("[0-9].[0-9]*")){
                        System.out.println("Token name = float const");
                        tabledata.add("Null\t\tfloat const\tfloat\t\t"+str);
                        System.out.println("Data Inserted in the table!");
                        break;
                    }
                case 28:
                    if(!str.contains("<>|>=|<=|<|>|==|+|-|/|*|'|;|{|}|=|begin|end|else|if|then|int|float|char|string") && !str.matches("\"[A-Z a-z]*\"") && !str.matches("\'[A-Za-z]\'")){
                        System.out.println("The unrecognized lexeme is :" +str);
                        System.out.println("Line Number :" + lineNumber.getLineNumber());
                        System.out.println("Error: unrecognized token found!");
                    } 
                case 29:
                    if(str.matches("\'[A-Za-z]\'")){
                        System.out.println("Token name = char const");
                        tabledata.add("Null\t\tchar const\tchar\t\t"+str);
                        System.out.println("Data Inserted in the table!");
                        break;
                    }
        }
    }
    
  }
}

【问题讨论】:

    标签: java duplicates set


    【解决方案1】:

    提取添加到执行检查数据是否已存在的子方法:

    private static void addData(Set<String> tabledata, String data)
    {
        if ( tabledata.contains(data) )
        {
            System.out.println("Data Already Exists!");
            return;
        }
    
        tabledata.add(data);
        System.out.println("Data Inserted in the table!");
    }
    

    然后这样称呼它:

    case 10:
        ...
        if(type.contains("int") && value.matches("[-+][0-9]*")){
            addData(tabledata, lexeme+"\t\tid\t\t"+type+"\t\t"+value);
        }
        ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 2017-01-25
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      相关资源
      最近更新 更多