2

2 つのテキスト ファイルを 1 つの結合テキスト ファイルに結合する必要があります。ファイルは数字のみで構成され、数字は昇順でリストする必要があります。これを行うようにコーディングしましたが、最後の数値を追加することができず、numberformatexception エラーが発生します。これは、最後の番号に比較対象がなく、リストに追加できないためだと思います。それ自体を比較するものが何もない場合、最後の数値を追加する方法がわかりません(別のifステートメントが必要だと確信していますが、それを行う方法がわかりません)、正しいwhileステートメントがわかりませんただし、プログラムは使用した while ステートメントで正しく実行されていますが、最後の番号はありません。

public static void main(String[] args) 
{
    FileReader file1         = null;
    FileReader file2         = null;
    BufferedReader readfile1 = null;
    BufferedReader readfile2 = null;
    FileWriter fileout       = null;
    PrintWriter dataout;
    String fname1         = "list1.txt";
    String fname2         = "list2.txt";
    int md                   = 0;
    int file1num             = 0;
    int file2num             = 0;
    String file1str;
    String file2str;

    try
      {
        file1 = new FileReader(fname1);
      }
    catch
        (FileNotFoundException xyz)
      {
        System.out.println("File not found: " + fname1);
        System.exit(-1);
      }
    catch
        (IOException abc)
      {
        System.out.println("IOException: caught");
        System.exit(-1);
      }
    readfile1 = new BufferedReader(file1);
    try
                  {
                    readfile2 = new FileReader(fname2);
                  }
    catch
                  (FileNotFoundException xyz)
                  {
                    System.out.println("File not found: " + fname2);
                    System.exit(-1);
                  }
                 catch
                  (IOException abc)
                  {
                    System.out.println("IOException: caught");
                    System.exit(-1);
                  }
                 readfile2 = new BufferedReader(file2);
                 try
                   {
                     fileout = new FileWriter("merged.txt");
                   }
                 catch(IOException adc)
                   {
                     System.out.println("file error");
                     System.exit(-1);
                   }
                 dataout = new PrintWriter(fileout);
                 file1str = file1.readLine();
                 file1num = Integer.parseInt(file1str);
                 file2str = file2.readLine();
                 file2num = Integer.parseInt(file2str);
                 while(md !=-1)
                   {
                     if(file1num<file2num)
                       {
                         md=file1num;
                         file1str = file1.readLine();
                         file1num = Integer.parseInt(file1str);
                       }
                     if(file2num<file1num)
                       {
                         md=file2num;
                         file2str = file2.readLine();
                         file2num = Integer.parseInt(file2str);
                       }
                     if(file1num==file2num)
                       {
                         md=file1num;
                         file1str = file1.readLine();
                         file1num = Integer.parseInt(file1str);
                       }
    }

したがって、ファイル 1 の最後の int が読み取られた後、null が返されることはわかっています。つまり、ファイル 2 はそれ自体を他のものと比較することはできず、それが私の問題の原因であると考えています。問題は while 文とその内容にあります。また、配列などを使用することはできません。2 つのファイルを単純に読み取り、比較して、最小の数値をマージ ファイルに追加する必要があります。

入力例:

ファイル1:

1
2 
3 
4 
6 
8

ファイル2:

3 
5 
6 
8
9

期待される出力:

1
2
3
3
4
5
6
6
8
8
9
4

3 に答える 3

2

いずれかのファイルが不足した場合にどうするかを検討する必要があります。

BufferedReader.readLine() は EOF で null を返すため、null を探すことになります。

ロジックは次のようになります

str1 = read file1
num1 = parse( str1 ) //parse() should be a method that can properly handle a null 
str2 = read file2    //and return something appropriate, like -1, when null 
num2 = parse( str2 ) //is encountered

while str1 != null || str2 != null

    if str2 == null || num1 < num2
        write num1
        str1 = read file1
        num1 = parse( str1 )
    else if str1 == null || num1 > num2
        write num2
        str2 = read file2
        num2 = parse( str2 )
    else if num1 == num2
        write num1
        write num2
        str1 = read file1
        num1 = parse( str1 )
        str2 = read file2
        num2 = parse( str2 )
于 2013-09-20T22:06:21.713 に答える
0

最初のファイルと 2 番目のファイルの整数値を保持する 2 つのリストがあると仮定すると、両方のファイルをリスト (たとえば lst1 と lst2) に読み込む場合、lst3 へのマージは簡単です。

Integer a1 = null;
Integer a2 = null;
while (!lst1.isEmpty() || !lst2.isEmpty()){
    try{
      a1 = (Integer)lst1.remove(0);
    }
    catch(Exception e){}
    try{
      a2 = (Integer)lst2.remove(0);
    }
    catch(Exception e){}

    if(a1 == null && a2 != null) lst3.add(a2);
    else if(a1 != null && a2 == null) lst3.add(a1);
    else{
        while(a1 < a2){
           lst3.add(a1);
           try{
               a1 = (Integer)lst1.remove(0);
           }        
           catch(Exception e){break;}  
        }
        while(a1 >= a2){
           lst3.add(a2);
           try{
               a2 = (Integer)lst2.remove(0);
           }        
           catch(Exception e){break;}  
        }     
        while(a1 != null && lst2.isEmpty()){
           lst3.add(a1);
           try{
               a1 = (Integer)lst1.remove(0);
           }        
           catch(Exception e){break;}  
        }   
        while(a2 != null && lst1.isEmpty()){
           lst3.add(a2);
           try{
               a2 = (Integer)lst2.remove(0);
           }        
           catch(Exception e){break;}  
        }        
    }    
}

次に、の内容をlst3出力ファイルに書き込むことができます。
免責事項: 私はメモ帳を使用してコードを書きました - おそらく少し「パッチ」を当てる必要があります ;)

于 2013-09-20T21:55:30.597 に答える
0

使用しようとするとtrim() Integer.parseInt(blabla.trim());、数字に1つ以上のスペース文字が含まれているため、解析が成功しませんでした。

サンプルコード:

public static void main(String[] args) throws MalformedURLException, IOException {

File file1 = new File("C:\\Users\\Melih\\Desktop\\file1.txt");
File file2 = new File("C:\\Users\\Melih\\Desktop\\file2.txt");
File output = new File("C:\\Users\\Melih\\Desktop\\file3.txt");

BufferedReader file1Reader = new BufferedReader(new FileReader(file1));
BufferedReader file2Reader = new BufferedReader(new FileReader(file2));
PrintWriter writer = new PrintWriter(output);

String file1Num = file1Reader.readLine();
String file2Num = file2Reader.readLine();

while (file1Num != null && file2Num != null) {
    int num1 = Integer.parseInt(file1Num.trim());
    int num2 = Integer.parseInt(file2Num.trim());

    if (num1 < num2) {
        writer.println(num1);
        file1Num = file1Reader.readLine();

    } else if (num2 < num1) {
        writer.println(num2);
        file2Num = file2Reader.readLine();
    } else {
        writer.println(num1);
        file1Num = file1Reader.readLine();
    }
}
while (file1Num != null) {

    writer.println(file1Num);
    file1Num = file1Reader.readLine();
}
while (file2Num != null) {
    writer.println(file2Num);
    file2Num = file2Reader.readLine();
}
file1Reader.close();
file2Reader.close();
writer.close();

}

于 2013-09-20T21:50:38.543 に答える