从Java中的输入文件合并k值

时间:2016-08-30 12:23:31

标签: java algorithm merge

我正在尝试编写一个合并函数,它会将 k 值从file1.txt和file2.txt合并到output.txt。

例如,如果我的file1.txt包含3 1 8 5并且file2.txt包含7 2 6 4,则它应该生成output.txt,内容为3 7 1 2 6 8 4 5( 2k <的排序对< / em>的)。因此,在 k = 1 的情况下,它会合并来自file1.txt和file2.txt的 k = 1 值。这适用于k = 1,2,4,8,......

到目前为止我所做的并没有达到预期的效果。我认为主要的问题是在第一个while循环中,因为它读取的内容超过它应该而且我不知道如何解决这个问题:/所以主要问题是如何正确设置条件以读取两个输入文件结束并合并对输出?

更具体地说,我试图使用Straight Merge方法将输入序列3 7 1 2 8 6 5 4分类为最终排序输出1 2 3 4 5 6 7 8。希望现在一切都清楚,可以帮助解决问题。

比你!

int i = 1;
int j = 1;
int k = 1;
BufferedWriter sorted_file_writer = new BufferedWriter(new FileWriter("output.txt",true));                      
BufferedReader wfr_1 = new BufferedReader(new FileReader("file1.txt"));
BufferedReader wfr_2 = new BufferedReader(new FileReader("file2.txt"));

int v1;
int v2;

String l1;
String l2;

while((i<=k) && (j<=k))             
{
    l1=wfr_1.readLine();
    l2=wfr_2.readLine();
    v1 = Integer.parseInt(l1);
    v2 = Integer.parseInt(l2);

    if(v1 < v2)
    {
        sorted_file_writer.write(Integer.toString(v1));
        sorted_file_writer.write(System.getProperty("line.separator"));
        i++;                    
    }

    else
    {
        sorted_file_writer.write(Integer.toString(v2));
        sorted_file_writer.write(System.getProperty("line.separator"));
        j++;
    }
}

while(i <= k)
{
    l1=wfr_1.readLine();
    v1 = Integer.parseInt(l1);

    sorted_file_writer.write(Integer.toString(v1));
    sorted_file_writer.write(System.getProperty("line.separator"));
    i++;
}

while(j <= k)
{   
    l2=wfr_2.readLine();
    v2 = Integer.parseInt(l2);  

    sorted_file_writer.write(Integer.toString(v2));
    sorted_file_writer.write(System.getProperty("line.separator"));                 
    j++;
 } 

6 个答案:

答案 0 :(得分:1)

您正在读取两个值并且只写一个值。 为什么在写值时使用计数器?

也许让它变得更简单?那怎么样:

void write(v1, v2)
{
    if(v1 < v2)
    {
        sorted_file_writer.write(Integer.toString(v1));
        sorted_file_writer.write(System.getProperty("line.separator"));
sorted_file_writer.write(Integer.toString(v2));
        sorted_file_writer.write(System.getProperty("line.separator"));               
    }

    else
    {
        sorted_file_writer.write(Integer.toString(v2));
        sorted_file_writer.write(System.getProperty("line.separator"));
sorted_file_writer.write(Integer.toString(v1));
        sorted_file_writer.write(System.getProperty("line.separator"));
    }
}

void main()
{
int k = 10; //for example

while(i <= k)
{
    l1=wfr_1.readLine();
    v1 = Integer.parseInt(l1);
    l2=wfr_2.readLine();
    v2 = Integer.parseInt(l2);

    write(v1, v2);
    i++;
}

}

答案 1 :(得分:0)

你遇到的问题是,在调整你读取的两个值之后,输出其中一个值,然后将另一个值抛出。您需要以正确的顺序输出两个值,而不是仅输出较小的值。

如果您希望它适用于较大的 k 值,那么到目前为止最简单的方法是从两个文件中读取所有 k 值,使用{{ 1}}或Arrays.sort()对它们进行排序,然后输出它们。

希望在没有为您编写代码的情况下为您提供足够的线索!

答案 2 :(得分:0)

问题在于,您在第一个循环的每次迭代中都从两个文件中读取值,但只使用一个值。您需要在输出文件中写入两个值。

答案 3 :(得分:0)

如果您知道文件的行数完全相同,则应避免使用迭代变量ij。循环的内容应该类似于:

l1=wfr_1.readLine();
l2=wfr_2.readLine();
v1 = Integer.parseInt(l1);
v2 = Integer.parseInt(l2);

if(v1 < v2)
{
    sorted_file_writer.write(Integer.toString(v1));
    sorted_file_writer.write(System.getProperty("line.separator"));
    sorted_file_writer.write(Integer.toString(v2));      
    sorted_file_writer.write(System.getProperty("line.separator"));             
}

else
{
    sorted_file_writer.write(Integer.toString(v2));
    sorted_file_writer.write(System.getProperty("line.separator"));
    sorted_file_writer.write(Integer.toString(v1));
    sorted_file_writer.write(System.getProperty("line.separator"));
}

答案 4 :(得分:0)

这是与数组完美配合的方法。我正在尝试为文件实现相同的功能,使用根本没有数组但没有运气。当我尝试将其重写为合并算法的文件版本时,它就无法工作(请参阅我的初始问题)。

根据之前我提到 k 的帖子,你现在可以想到它像a.length和b.length在第一次迭代中是k = 1,然后k = 2并且在结束k = 4个元素,从而产生8个元素的最终排序序列。如果您对此有更多疑问,请与我们联系。

谢谢!

public class MergeArrays
{
    public static void main(String[] args)
    {               
        int a[] = {3}; // or {3,7} or {1,2,3,7}
        int b[] = {7}; // or {1,2} or {4,5,6,8}

        merge(a, b);                                
    }

    private static void merge(int[] a, int[] b)
    {
        int i = 0;
        int j = 0;      

        while(i<a.length && j<b.length)
        {
            if (a[i] < b[j])
            {
                System.out.println(a[i++]);            
            }

            else
            {
                System.out.println(b[j++]);             
            }          
        }

        /* Print the rest of the remaining array */
        while (i < a.length)
        {
            System.out.println(a[i++]);          
        }

        while (j < b.length)
        {
            System.out.println(b[j++]);          
        }       
    }
}

答案 5 :(得分:0)

int x = rand() % 4;
            switch(x)
            {
               case 0:
                  GCChatTargetSend(lpObj,lpObj->Index,"String message 1 Here");
                  break;

               case 1:
                  GCChatTargetSend(lpObj,lpObj->Index,"String message 2 Here");
                  break;

               case 2:
                  GCChatTargetSend(lpObj,lpObj->Index,"String message 3 Here");
                  break;

               case 3:
                  GCChatTargetSend(lpObj,lpObj->Index,"String message 4 Here");
                  break;
            }