Advertisement
Guest User

Untitled

a guest
Jun 12th, 2019
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.54 KB | None | 0 0
  1. // it is prob a bad idea to import everything but
  2. import java.util.*;
  3. import java.io.*;
  4.  
  5. class Main {
  6.     public static void main(String[] args) {
  7.         // init set of items. O(n)[for each line] * O(1)[hash set insertion] -> O(n)
  8.         LinkedHashSet<String> items = new LinkedHashSet<>();
  9.         Scanner inFile = null;
  10.         try {
  11.             inFile = new Scanner(new File(args[0]));
  12.         } catch (FileNotFoundException e) {
  13.             e.printStackTrace();
  14.         }
  15.         while (inFile.hasNextLine()) {
  16.             items.add(inFile.nextLine().replace("\"", ""));
  17.         }
  18.         //System.out.println("input : " + items.toString());
  19.         // build maps. O(n)[for each element] * (O(1)[hash map lookup] + O(1)[hash map insertion]) -> O(n)
  20.         ArrayList<LinkedHashMap<String, LinkedHashSet<String>>> mappingsStringContainer = new ArrayList<>(3);
  21.         for (int i = 0; i != 3; ++i){ // construct first
  22.             mappingsStringContainer.add(new LinkedHashMap<>());
  23.         }
  24.         for (String e : items){ // fill
  25.             String[] e_array = e.split(";", -1);
  26.             if (e_array.length != 3){
  27.                 throw new RuntimeException("invalid structure of element : " + e);
  28.             }
  29.             for(int i = 0; i < e_array.length; i++) {
  30.                 if (e_array[i].isEmpty()){
  31.                     continue;
  32.                 }
  33.                 LinkedHashMap<String, LinkedHashSet<String>> map = mappingsStringContainer.get(i);
  34.                 if (map.containsKey(e_array[i])){
  35.                     map.get(e_array[i]).add(e);
  36.                 } else {
  37.                     map.put(e_array[i], new LinkedHashSet<>(List.of(e)));
  38.                 }
  39.             }
  40.         }
  41.         //System.out.println("mappingsStringContainer : " + mappingsStringContainer.toString());
  42.         // process and get results.
  43.         ArrayList<LinkedHashSet<String>> results = new ArrayList<>();
  44.         while (!items.isEmpty()){
  45.             String items_e = items.iterator().next();
  46.             if (!items.contains(items_e)){
  47.                 continue;
  48.             }
  49.             Set<LinkedHashSet<String>> queue = new LinkedHashSet<>();
  50.             LinkedHashSet<String> res_set = new LinkedHashSet<>();
  51.             // fill first one
  52.             String[] items_e_split = items_e.split(";", -1);
  53.             for(int i = 0; i < items_e_split.length; i++) {
  54.                 if (!items_e_split[i].isEmpty()){ // skip empty
  55.                     queue.add(mappingsStringContainer.get(i).get(items_e_split[i]));
  56.                     //System.out.println("queue : " + queue.toString());
  57.                 }
  58.             }
  59.             // the rest
  60.             while (!queue.isEmpty()){
  61.                 // poll one set
  62.                 Iterator<LinkedHashSet<String>> queue_i = queue.iterator();
  63.                 LinkedHashSet<String> queue_set = queue_i.next();
  64.                 queue_i.remove();
  65.                 // traverse it
  66.                 for (String queue_e : queue_set){
  67.                     if (!items.contains(queue_e)){
  68.                         continue;
  69.                     }
  70.                     String[] e_array = queue_e.split(";", -1);
  71.                     for(int i = 0; i < e_array.length; i++) {
  72.                         if (!e_array[i].isEmpty()) {
  73.                             LinkedHashMap<String, LinkedHashSet<String>> map = mappingsStringContainer.get(i);
  74.                             LinkedHashSet<String> set = map.get(e_array[i]);
  75.                             if (set != null)
  76.                                 queue.add(set);
  77.                             mappingsStringContainer.get(i).remove(e_array[i]);
  78.                             //System.out.println("queue : " + queue.toString());
  79.                         }
  80.                         res_set.add(queue_e);
  81.                         items.remove(queue_e);
  82.                     }
  83.                 }
  84.             }
  85.             results.add(res_set);
  86.         }
  87.         Collections.sort(results, Comparator.comparingInt(LinkedHashSet<String>::size));
  88.         try (PrintWriter writer = new PrintWriter(new File(args[1]))) {
  89.             writer.write("number of groups : "+results.size()+"\n");
  90.             for(int i = 0; i != results.size(); ++i) {
  91.                 writer.write("group #" + i + " : \n");
  92.                 for(String e : results.get(i)) {
  93.                     writer.write("\t" + e + "\n");
  94.                 }
  95.                 i++;
  96.             }
  97.         } catch (FileNotFoundException e) {
  98.             System.out.println("Could not write to file." + e.getMessage());
  99.         }
  100.     }
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement