【问题标题】:How do I sort records in a text file using Java?如何使用 Java 对文本文件中的记录进行排序?
【发布时间】:2010-10-18 23:06:21
【问题描述】:

对txt文件中的数据进行了一些修改。 我已经尝试了建议的代码,但我没有成功地将它再次写入这种格式的 txt 文件中。我尝试了 collection.sort,但它在长行中写入了数据。

我的 txt 文件包含这些数据:

Monday
Jessica  Run      20mins
Alba     Walk     20mins
Amy      Jogging  40mins
Bobby    Run      10mins
Tuesday
Mess     Run      20mins
Alba     Walk     20mins
Christy  Jogging  40mins
Bobby    Run      10mins

如何将这些数据按升序排序并在排序后再次存储在txt文件中?

Monday
Alba     Walk     20mins
Amy      Jogging  40mins
Bobby    Run      10mins
Jessica  Run      20mins
Tuesday
Alba     Walk     20mins
Bobby    Run      10 mins
Christy  Jogging  40mins
Mess     Run      20mins
Jessica  Run      20mins

【问题讨论】:

    标签: java file sorting text-files


    【解决方案1】:

    这是我想出来的:

    import java.io.*;
    import java.util.*;
    
    public class Sort {
    
        public static void main(String[] args) throws Exception {
            BufferedReader reader = new BufferedReader(new FileReader("fileToRead"));
            Map<String, String> map=new TreeMap<String, String>();
            String line="";
            while((line=reader.readLine())!=null){
                map.put(getField(line),line);
            }
            reader.close();
            FileWriter writer = new FileWriter("fileToWrite");
            for(String val : map.values()){
                writer.write(val);  
                writer.write('\n');
            }
            writer.close();
        }
    
        private static String getField(String line) {
            return line.split(" ")[0];//extract value you want to sort on
        }
    }
    

    【讨论】:

    • 不支持重复键。好点,但如果我认为这是一个要求,我会以不同的方式编写它。
    • 添加重复键的支持后,代码对我非常有用:)
    • @Markus 你能发布你为允许重复键所做的修改吗?
    【解决方案2】:
    package com.myFiles;
    
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.ArrayList;
    import java.util.Collections;
    
    public class FilesReaderWriter {
        public static void main(String[] args) throws IOException {
            BufferedReader reader = null;
            PrintWriter outputStream = null;
            ArrayList<String> rows = new ArrayList<String>();
    
            try {
                reader  = new BufferedReader(new FileReader("Input.txt"));
                outputStream = new PrintWriter(new FileWriter("Output.txt"));
    
                String file;
                while ((file = reader .readLine()) != null) {
                    rows.add(file);
                }
                Collections.sort(rows);
                String[] strArr= rows.toArray(new String[0]);
                for (String cur : strArr)
                    outputStream.println(cur);
            } finally {
                if (reader  != null) {
                    inputStream.close();
                }
                if (outputStream != null) {
                    outputStream.close();
                }
            }
        }
    
    }
    

    【讨论】:

    • 我能够在 1-2 秒内处理相当大的文件 ~40MB。
    【解决方案3】:

    这是一种非常懒惰的做法,因为您只对第一个单词进行排序:

        ArrayList<String> rows = new ArrayList<String>();
        BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
    
        String s;
        while((s = reader.readLine())!=null)
            rows.add(s);
    
        Collections.sort(rows);
    
        FileWriter writer = new FileWriter("output.txt");
        for(String cur: rows)
            writer.write(cur+"\n");
    
        reader.close();
        writer.close();
    

    【讨论】:

    • 使用 writer.newLine();而不是添加+“\n”来写
    【解决方案4】:

    使用sort

    aaron@ares ~$ sort data.txt 
    Alba     Walk     20mins
    Amy      Jogging  40mins
    Bobby    Run      10mins
    Jessica  Run      20mins
    
    aaron@ares ~$ sort data.txt > sorted.txt
    aaron@ares ~$ cat sorted.txt
    Alba     Walk     20mins
    Amy      Jogging  40mins
    Bobby    Run      10mins
    Jessica  Run      20mins
    

    ...或使用python:

    aaron@ares ~$ python -c "import sys; print ''.join(sorted(sys.stdin))" < data.txt > sorted.txt
    aaron@ares ~$ cat sorted.txt 
    Alba     Walk     20mins
    Amy      Jogging  40mins
    Bobby    Run      10mins
    Jessica  Run      20mins
    

    【讨论】:

    • 呸...这不是问题...我讨厌人们这样做。
    • +1;它可能无法完全回答问题,但如果您只是一次性完成,使用 sort 可以节省编写实用程序的时间。
    • @Sujoy 在我发布答案后他改变了问题。
    【解决方案5】:

    有一个包含 3 个参数的类:名称、操作和长度。

    打开您的文件进行阅读,逐字阅读,为每个人创建一个新的类实例并填充适当的值,然后将该实例插入某个集合。

    通过编写您自己的排序方法或(更好的选择)使用 Java 排序函数之一对您的集合进行排序。

    打开另一个文件进行写入,并以相同的方式写入您的排序集合。

    如果上面的动作不能翻译成代码,请购买《Core JAVA》这本书好好阅读或者希望这里有人大方,给你一个完整的代码。 :)

    【讨论】:

    • 第 3 段中的错字(购买 -> 由)。您(和其他所有人 - 这是通过编辑添加的吗?)忽略了一周中的日子。
    • 据我记得,预编辑的帖子中没有星期几。
    【解决方案6】:
    import java.io.*;
    import java.util.*;
    
    public class Sort1 {
        public static void main(String[] args) throws Exception {
            BufferedReader reader = new BufferedReader(new FileReader("fileToRead.txt"));
            Map<String, String> map=new TreeMap<String, String>();
            String line="";
            while((line=reader.readLine())!=null){
                    map.put(getField(line),line);
            }
            reader.close();
            BufferedWriter writer = new BufferedWriter(new FileWriter("fileToWrite1.txt"));
            for(String val : map.values()){
                    writer.write(val);      
                    writer.newLine();
            }
            writer.close();
        }
    
        private static String getField(String line) {
            return line.split(" ")[0];//extract value you want to sort on
        }
    }
    

    【讨论】:

      【解决方案7】:

      此解决方案使用 Java 8 Stream API。

      考虑Files.writeStream&lt;CharSequence&gt; 作为第二个参数,所以我们需要通过map(Function.identity()) 进行类型转换。

      import java.io.IOException;
      import java.nio.file.*;
      import java.util.function.Function;
      import java.util.stream.Stream;
      
      public class FileSortWithStreams {
      
          public static void main(String[] args) throws IOException {
              Path initialFile = Paths.get("files/initial.txt");
              Path sortedFile = Paths.get("files/sorted.txt");
      
              Stream<CharSequence> sortedLines = Files.lines(initialFile).sorted().map(Function.identity());
      
              Files.write(sortedFile, sortedLines::iterator, StandardOpenOption.CREATE);
          }
      }
      

      【讨论】:

      • 这绝对是 Java 中最短的实现。这对于较大的文件(例如,~1MB 的文本)是否有效?
      【解决方案8】:

      如果该文件中的数据量不大,请尝试以下操作:

      将其所有内容加载到一个

      String s = <<file contents>>;
      
      String[] strings = s.split(<<here comes lovely regex something like \w+\s\w+\s\w>>);
      
      Arrays.sort(strings);
      
      for (String str : strings) {
        write  str  to your output file;
      }
      

      但我太累了,无法提出更明智的建议......

      【讨论】:

        猜你喜欢
        • 2019-02-04
        • 2021-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-29
        • 2022-01-18
        • 2013-03-16
        • 1970-01-01
        相关资源
        最近更新 更多