Reputation: 5
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
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
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