Java 如何将两个文件中的数字合并到一个新文件中?

Java 如何将两个文件中的数字合并到一个新文件中?,java,Java,我有两个文本文件,其中包含按升序排序的数字(整数)。现在我想创建一个新的文本文件,其中包含两个文件中的所有数字。换句话说,两个文件中的值必须合并到一个新文件中。新文件中的数字也必须按升序排列 例如: 文件1:13579 文件2:246810 新文件必须包含:1 2 3 4 5 6 7 8 9 10 在我创建的方法中,问题是它开始扫描两个文件file1:1 file2:2中的第一个数字。它发现file1中的数字是扫描器在两个文件中转到下一个数字的最小值。所以接下来要扫描的是文件1:3文件2:4。那

我有两个文本文件,其中包含按升序排序的数字(整数)。现在我想创建一个新的文本文件,其中包含两个文件中的所有数字。换句话说,两个文件中的值必须合并到一个新文件中。新文件中的数字也必须按升序排列

例如:
文件1:13579
文件2:246810
新文件必须包含:1 2 3 4 5 6 7 8 9 10

在我创建的方法中,问题是它开始扫描两个文件file1:1 file2:2中的第一个数字。它发现file1中的数字是扫描器在两个文件中转到下一个数字的最小值。所以接下来要扫描的是文件1:3文件2:4。那么最小的是3。但是,已跳过第一次扫描的数字2和第二次扫描的数字4。以下是我目前的代码:

    public static void mergeAllNumbers(String fileName1, String fileName2, String fileNameNew)
        throws FileNotFoundException {
    Scanner scanFile1 = new Scanner(new File(fileName1));
    Scanner scanFile2 = new Scanner(new File(fileName2));
    PrintWriter writeToFile = new PrintWriter(fileNameNew);

    // merge as long as there is something in both files
    while (scanFile1.hasNextInt() && scanFile2.hasNextInt()) {
        int value1 = scanFile1.nextInt();
        int value2 = scanFile2.nextInt();

        if (value1 <= value2) {
            // The number in fileName1 is less
            writeToFile.write(value1 + "");
            writeToFile.write(System.getProperty("line.separator"));

        } else { // The number in fileName2 is less
            writeToFile.write(value2 + "");
            writeToFile.write(System.getProperty("line.separator"));
        }
    }

    // empty the file which is not empty
    while (scanFile1.hasNextInt()) {
        int value1 = scanFile1.nextInt();
        writeToFile.write(value1 + "");
        writeToFile.write(System.getProperty("line.separator"));
    }
    while (scanFile2.hasNextInt()) {
        int value2 = scanFile2.nextInt();
        writeToFile.write(value2 + "");
        writeToFile.write(System.getProperty("line.separator"));
    }
    scanFile1.close();
    scanFile2.close();
    writeToFile.close();
}
publicstaticvoidmergeallnumbers(stringfilename1、stringfilename2、stringfilenamew)
抛出FileNotFoundException{
Scanner scanFile1=新扫描仪(新文件(fileName1));
Scanner scanFile2=新扫描仪(新文件(fileName2));
PrintWriter writeToFile=新的PrintWriter(fileNameNew);
//只要两个文件中都有内容,就可以合并
而(scanFile1.hasnetint()和&scanFile2.hasnetint()){
int value1=scanFile1.nextInt();
int value2=scanFile2.nextInt();

如果(value1因为您在两个文件上都调用了.nextInt(),您将始终丢失不使用的数字。您可以将这两个数字读入两个单独的数组,然后对它们执行合并排序。
我看到你缺少的东西:

1) 第一次读取两个文件后,只应从正在写入的文件中读取(如果写入file1的值,则从file1中读取下一个值)

2)考虑两个值是相等的,在这种情况下,既要写入两个值,也要读取两个文件的下一个值。这是假设合并意味着即使复制了所有的记录也会合并。

while循环应如下所示:

int value1 = -1; // -1 just to give it an initial value
int value2 = -1;
boolean eof1 = !scanFile1.hasNextInt();
booelan eof2 = !scanFile2.hasNextInt();
if(!eof1){
    value1 = scanFile1.nextInt();
} 

if(!eof2){
    value2 = scanFile2.nextInt();
}
while (!eof1 && !eof2) {

        if (value1 < value2) {
            // The number in fileName1 is less
            writeToFile.write(value1 + "");
            writeToFile.write(System.getProperty("line.separator"));
            eof1 = !scanFile1.hasNextInt();
            if(!eof1){
                value1 = scanFile1.nextInt();
            }

        } else if(value1 > value2){ // The number in fileName2 is less
            writeToFile.write(value2 + "");
            writeToFile.write(System.getProperty("line.separator"));
            eof2 = !scanFile2.hasNextInt();
            if(!eof2){
                value2 = scanFile2.nextInt();
            }
        }else{ // they are equal
            writeToFile.write(value1 + "");
            writeToFile.write(System.getProperty("line.separator"));
            eof1 = !scanFile1.hasNextInt();
            if(!eof1){
                value1 = scanFile1.nextInt();
            }
            eof2 = !scanFile2.hasNextInt();
            if(!eof2){
                value2 = scanFile2.nextInt();
            }
        }
    }
int value1=-1;//-1只是为了给它一个初始值
整数值2=-1;
布尔eof1=!scanFile1.hasNextInt();
booelan eof2=!scanFile2.hasNextInt();
如果(!eof1){
value1=scanFile1.nextInt();
} 
如果(!eof2){
value2=scanFile2.nextInt();
}
而(!eof1&!eof2){
如果(值1<值2){
//fileName1中的数字较少
writeToFile.write(值1+“”);
writeToFile.write(System.getProperty(“line.separator”);
eof1=!scanFile1.hasNextInt();
如果(!eof1){
value1=scanFile1.nextInt();
}
}否则,如果(value1>value2){//fileName2中的数字较小
writeToFile.write(值2+“”);
writeToFile.write(System.getProperty(“line.separator”);
eof2=!scanFile2.hasNextInt();
如果(!eof2){
value2=scanFile2.nextInt();
}
}否则{//他们是平等的
writeToFile.write(值1+“”);
writeToFile.write(System.getProperty(“line.separator”);
eof1=!scanFile1.hasNextInt();
如果(!eof1){
value1=scanFile1.nextInt();
}
eof2=!scanFile2.hasNextInt();
如果(!eof2){
value2=scanFile2.nextInt();
}
}
}

您可以使用合并排序。该排序算法非常适合您的需要,可以将两个整数流合并为一个。另一个选项是使用Java 8 streaming和flatmap运算符,后跟集合sort()。这是面试问题吗?;)@FlyingDutchman代码/算法是什么样子的?谢谢你的建议,但我想在第一个while循环中不创建任何数组而将数字放入新文件中,我在第一个if语句中检查value1中的数字是否小于或等于value2中的数字。也就是说,duplicaTES只会在新文件中被添加一次。但是你是正确的,我应该只从我所写的文件中读取,但是我不知道如何写代码……而不是在循环中初始化Value1和Value2在进入循环之前做它。然后只对相关的IF块重复这个指令。ey显式相等,因为在这种情况下,必须读取两个值(即使只写入其中一个)。