user2839657
user2839657

Reputation: 5

Sorting in Java, String comparison

This data is saved in data.txt I am trying to write a program that can arrange

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
   SS844 Parallel Algorithms 
   SS567 Hacking Quantum Network

17b2582
   SS567 Hacking Quantum Network
   SS844 Parallel Algorithms 
   SS501 Quantum Communication

A big list of data like this, And need to write a program to short this data is ascending order by registration number and course will follow the registration number. so the expected out put is like this.

Out put will, course Title and the students registration number who are taking that course sample:

SS501 Quantum Communication
     18b0885
     17b2582

SS567 Hacking Quantum Network
     17b2582
     17b0585

SS844 Parallel Algorithms 
     17b2582
     17b0585
     18b0885

and so on, Which method will be easier to do this

It doesn't give the desired answer

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;
import java.util.Set;
import java.util.TreeSet;

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

    }
    reader.close();
    FileWriter writer = new FileWriter("sorted_numbers4.txt");
    writer.write("");
//     for (List<String> list : map.values()) {
//      for (String val : list) {
//       writer.write(val);
//       writer.write("\n");
//      }
//     }
    for (Set<string> key : map.keySet()){
//print key (subject) here
      writer.write("Subject="+key+"\n");
      for (Set<String> list : map.get(key)) {
        for (String val : list) {
          writer.write(val);
          writer.write("\n");
        }
      }
    }

    writer.close();
  }

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

The above program out puts into another text file like this

    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

Any recommendation to modify to get desired answer?

Upvotes: 0

Views: 384

Answers (1)

Bimalesh Jha
Bimalesh Jha

Reputation: 1504

Instead of Map<String, List<String>> map = new TreeMap<String, List<String>>(); use Map<String, Set<String>> map = new TreeMap<String, Set<String>>(); and then use a TreeSet instead of a LinkedList e.g. l = new TreeSet<String>(); This ensures that list (set) entries are unique and sorted.

Now while writing out, iterate first on KeySet of the Map and then iterate the values (set) associated with each keys, something like below pseudo-code:

for (String key : map.keySet()){
//print key (subject) here
writer.write("Subject="+key+"\n");
for (Set<String> list : map.get(key)) {
      for (String val : list) {
       writer.write(val);
       writer.write("\n");
      }
}
}

EDIT: parsing logic- from your sample data, I can see that course names begin with "S" character while registration numbers are hex/numeric. may be you could use this information while parsing the data.

Upvotes: 1

Related Questions