合并两个文本文件并将其排序到第三个文件

时间:2016-06-13 05:43:00

标签: java arrays sorting merge

我试图创建一个程序,将两个不同的文本文件合并为第三个文件,该文件按升序排序。这是两个文件中的内容

档案1:12 23 34 45 56 67 69 123 133

档案2:4 5 10 20 35 44 100 130 150 160 180

这是我到目前为止的代码:

    try 
    {

        FileReader file1=new FileReader("D://School//text1.txt");   
        Scanner scan = new Scanner(new File("D://School//text1.txt"));
        ArrayList<Integer> values = new ArrayList<Integer>(); 
        Collections.sort(values);      //sorting the values 
        while(scan.hasNextInt()) values.add(scan.nextInt());

        FileReader file2=new FileReader("D://School//text2.txt");
        scan = new Scanner(new File("D://School//text2.txt")); 
        values = new ArrayList<>();
        Collections.sort(values);       //sorting the values. 
        while(scan.hasNextInt()) values.add(scan.nextInt());

        BufferedReader br1 = new BufferedReader (file1);
        BufferedReader br2 = new BufferedReader(file2);

        String temp1 = "";
        String temp2 = "";

        while(br1.readLine() !=null)
        {
            temp1=br1.readLine()+temp1;
        }
        while(br2.readLine()!=null)
        {
            temp2=br2.readLine()+temp2;
        }
        String temp = temp1 + temp2; 



        FileWriter fw=new FileWriter("D://School//text3.txt"); 
        char buffer[]=new char[temp.length()];
        temp.getChars(0,temp.length(),buffer,0);                        
        fw.write(buffer);
        file1.close();
        file2.close();
        fw.close();
    } 

    catch (IOException e) 
    {
        e.printStackTrace();
    }

到目前为止,程序将能够读取和写入第三个文件中的正确内容,但是,它不能按升序排序。

以下是程序将打印到第三个文件的内容

12 23 34 45 56 67 69 123 133 4 5 10 20 35 44 100 130 150 160 180

我希望将其排序到第三个文件中

4 5 10 12 20 23 34 35 44 45 56 67 69 100 123 130 133 150 160 180

提前致谢:)

2 个答案:

答案 0 :(得分:1)

我建议您使用TreeSet,我在您的代码中看到了一些问题。

TreeSet<Integer> treeSet = new TreeSet<Integer>();
while(scan.hasNextInt()) treeSet.add(scan.nextInt());
scan = new Scanner(new File("D://School//text2.txt")); 
//Do not new Collection!!!!!
while(scan.hasNextInt()) treeSet.add(scan.nextInt());

你可以为每个集合

for (Integer i : treeSet) {
        System.out.println(i);
}

如果你有jdk8,你可以试试这个。

    ArrayList<Integer> ints = new ArrayList<>();
    Files.readAllLines(Paths.get("D://School//text1.txt"), StandardCharsets.UTF_8).forEach(x -> Arrays.asList(x.split(" ")).stream().forEach(y -> ints.add(Integer.parseInt(y))));
    Files.readAllLines(Paths.get("D://School//text2.txt"), StandardCharsets.UTF_8).forEach(x -> Arrays.asList(x.split(" ")).stream().forEach(y -> ints.add(Integer.parseInt(y))));
    Collections.sort(ints);
    StringBuilder sb = new StringBuilder();
    ints.stream().map(x -> x + " ").forEach(sb::append);
    Files.write(Paths.get("D://School//text3.txt"),sb.toString().getBytes(),StandardOpenOption.WRITE,StandardOpenOption.CREATE);

答案 1 :(得分:0)

当您致电Collections.sort(values);时,您正在对空ArrayList进行排序。

将所有值添加到Collections.sort(values);后,您需要致电ArrayList

您可以运行这些示例进行测试:

示例1

List<Integer> values = new ArrayList<Integer>();

// sort the list first
Collections.sort(values);

values.add(5);
values.add(3);
values.add(8);
values.add(1);

System.out.println(values);
  

输出:[5,3,8,1]

示例2

List<Integer> values = new ArrayList<Integer>();

values.add(5);
values.add(3);
values.add(8);
values.add(1);

// sort the list now
Collections.sort(values);

System.out.println(values);
  

输出:[1,3,5,8]