使用外部文本文件在Java中进行排序

时间:2013-11-05 02:01:16

标签: java algorithm sorting

此数据保存在data.txt中我正在尝试编写可以安排的程序

18b0885  // this is the registration number, bullet points to show indentation 
   SS844 Parallel Algorithms        //  These are course taken by student
   SS555 Calculus for Distributed Computing
   SS501 Quantum Communication

17b0585
   SS828 Problem Based Programming
   SS660 Genetic Computation
   SS567 Hacking Quantum Network

17b2582
   SS567 Hacking Quantum Network
   SS876 Positronics
   SS880 Quark-based Logic

这样的大数据列表,并且需要编写一个程序来缩短这个数据,按照注册号升序,当然会遵循注册号。所以预期的出局是这样的。


17b2582
   SS567 Hacking Quantum Network
   SS876 Positronics
   SS880 Quark-based Logic

17b0585
   SS828 Problem Based Programming
   SS660 Genetic Computation
   SS567 Hacking Quantum Network

18b0885  
   SS844 Parallel Algorithms       
   SS555 Calculus for Distributed Computing
   SS501 Quantum Communication

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

public class Sort {
    public static void main(String[] args) throws Exception {
     BufferedReader reader = new BufferedReader(new FileReader("data.txt"));
     Map<String, List<String>> map = new TreeMap<String, List<String>>();
     String line = reader.readLine();//read header
     while ((line = reader.readLine()) != null) {
      String key = getField(line);
      List<String> l = map.get(key);
      if (l == null) {
       l = new LinkedList<String>();
       map.put(key, l);
      }
      l.add(line);

     }
     reader.close();
     FileWriter writer = new FileWriter("sorted_numbers3.txt");
     writer.write("");
     for (List<String> list : map.values()) {
      for (String val : list) {
       writer.write(val);
       writer.write("\n");
      }
     }
     writer.close();
    }

    private static String getField(String line) {
     return line.split(",")[0];// 
    }
}

上面的程序输出到另一个像这样的文本文件

    SS501 Quantum Communication
    SS555 Calculus for Distributed Computing
    SS567 Hacking Quantum Network
    SS567 Hacking Quantum Network
    SS660 Genetic Computation
    SS828 Problem Based Programming
    SS844 Parallel Algorithms
    SS876 Positronics
    SS880 Quark-based Logic

    17b2582
    17b0585
    18b0885

按照升序排列所有coureses然后注册号码,但不是我想要的。我应该改变什么?

1 个答案:

答案 0 :(得分:0)

好吧,正如其他人所说,你的示例输出没有按任何排序顺序我可以看到。如果你真的想按字母顺序排列连续剧,那么就可以了。

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Sorter {

    static List<Data> read() throws FileNotFoundException, IOException {
        BufferedReader reader = new BufferedReader(new FileReader("data.txt"));
        List<Data> list = new ArrayList<>();
        String line;
        Data data = null;
        while ((line = reader.readLine()) != null) {
            if (line.matches("\\s*")) {
                continue; // skip blank lines
            }
            // Assume line that begins with space is a course.
            if (Character.isSpaceChar(line.charAt(0))) {
                //  Add new course to data if it's there.
                if (data == null) {
                    System.err.println("Missing serial for course " + line);
                } else {
                    data.courses.add(line);
                }
            } else {
                // Add completed data to list if there is one.
                if (data != null) {
                    list.add(data);
                }
                // Make new data with this serial.
                data = new Data(line);
            }
        }
        // Add the last data to the list if there is one.
        if (data != null) {
            list.add(data);
        }
        return list;
    }

    public static void main(String[] args) {
        try {
            // Read.
            List<Data> list = read();

            // Sort based on serials.
            Collections.sort(list, new Comparator<Data>() {
                @Override
                public int compare(Data a, Data b) {
                    return a.serial.compareTo(b.serial);
                }
            });

            // Print.
            for (Data data : list) {
                data.print();
            }
        } catch (Exception ex) {
            System.err.println("Read failed.");
        }
    }
}

// Local class to hold data: a serial and related courses.
class Data {

    String serial;
    List<String> courses;

    Data(String serial) {
        this.serial = serial;
        courses = new ArrayList<>();
    }

    void print() {
        System.out.println(serial);
        for (String course : courses) {
            System.out.println(course);
        }
    }
}