Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // it is prob a bad idea to import everything but
- import java.util.*;
- import java.io.*;
- class Main {
- public static void main(String[] args) {
- // init set of items. O(n)[for each line] * O(1)[hash set insertion] -> O(n)
- LinkedHashSet<String> items = new LinkedHashSet<>();
- Scanner inFile = null;
- try {
- inFile = new Scanner(new File(args[0]));
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- }
- while (inFile.hasNextLine()) {
- items.add(inFile.nextLine().replace("\"", ""));
- }
- //System.out.println("input : " + items.toString());
- // build maps. O(n)[for each element] * (O(1)[hash map lookup] + O(1)[hash map insertion]) -> O(n)
- ArrayList<LinkedHashMap<String, LinkedHashSet<String>>> mappingsStringContainer = new ArrayList<>(3);
- for (int i = 0; i != 3; ++i){ // construct first
- mappingsStringContainer.add(new LinkedHashMap<>());
- }
- for (String e : items){ // fill
- String[] e_array = e.split(";", -1);
- if (e_array.length != 3){
- throw new RuntimeException("invalid structure of element : " + e);
- }
- for(int i = 0; i < e_array.length; i++) {
- if (e_array[i].isEmpty()){
- continue;
- }
- LinkedHashMap<String, LinkedHashSet<String>> map = mappingsStringContainer.get(i);
- if (map.containsKey(e_array[i])){
- map.get(e_array[i]).add(e);
- } else {
- map.put(e_array[i], new LinkedHashSet<>(List.of(e)));
- }
- }
- }
- //System.out.println("mappingsStringContainer : " + mappingsStringContainer.toString());
- // process and get results.
- ArrayList<LinkedHashSet<String>> results = new ArrayList<>();
- while (!items.isEmpty()){
- String items_e = items.iterator().next();
- if (!items.contains(items_e)){
- continue;
- }
- Set<LinkedHashSet<String>> queue = new LinkedHashSet<>();
- LinkedHashSet<String> res_set = new LinkedHashSet<>();
- // fill first one
- String[] items_e_split = items_e.split(";", -1);
- for(int i = 0; i < items_e_split.length; i++) {
- if (!items_e_split[i].isEmpty()){ // skip empty
- queue.add(mappingsStringContainer.get(i).get(items_e_split[i]));
- //System.out.println("queue : " + queue.toString());
- }
- }
- // the rest
- while (!queue.isEmpty()){
- // poll one set
- Iterator<LinkedHashSet<String>> queue_i = queue.iterator();
- LinkedHashSet<String> queue_set = queue_i.next();
- queue_i.remove();
- // traverse it
- for (String queue_e : queue_set){
- if (!items.contains(queue_e)){
- continue;
- }
- String[] e_array = queue_e.split(";", -1);
- for(int i = 0; i < e_array.length; i++) {
- if (!e_array[i].isEmpty()) {
- LinkedHashMap<String, LinkedHashSet<String>> map = mappingsStringContainer.get(i);
- LinkedHashSet<String> set = map.get(e_array[i]);
- if (set != null)
- queue.add(set);
- mappingsStringContainer.get(i).remove(e_array[i]);
- //System.out.println("queue : " + queue.toString());
- }
- res_set.add(queue_e);
- items.remove(queue_e);
- }
- }
- }
- results.add(res_set);
- }
- Collections.sort(results, Comparator.comparingInt(LinkedHashSet<String>::size));
- try (PrintWriter writer = new PrintWriter(new File(args[1]))) {
- writer.write("number of groups : "+results.size()+"\n");
- for(int i = 0; i != results.size(); ++i) {
- writer.write("group #" + i + " : \n");
- for(String e : results.get(i)) {
- writer.write("\t" + e + "\n");
- }
- i++;
- }
- } catch (FileNotFoundException e) {
- System.out.println("Could not write to file." + e.getMessage());
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement