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("\"", ""));
- }
- // 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)));
- }
- }
- }
- // process and get results. O(n) [for each element] * O(m) [complexity of processing each one] -> O(n * m), m - max group size
- ArrayList<LinkedHashSet<String>> results = new ArrayList<>();
- while (!items.isEmpty()){
- String items_e = items.iterator().next();
- if (!items.contains(items_e)){
- continue;
- }
- if (items_e.equals(";;")){ // )':
- //results.add(new LinkedHashSet<>(List.of(items_e)));
- items.remove(items_e);
- continue;
- }
- Set<LinkedHashSet<String>> queue = new LinkedHashSet<>();
- LinkedHashSet<String> res_set = new LinkedHashSet<>();
- String[] items_e_split = items_e.split(";", -1);
- for(int i = 0; i < items_e_split.length; i++) {
- if (!items_e_split[i].isEmpty()){
- queue.add(mappingsStringContainer.get(i).get(items_e_split[i])); // O(1) * 2 [LinkedHashMap/ArrayList access] + O(1) [LinkedHashSet insertion] -> O(1)
- }
- }
- while (!queue.isEmpty()){
- Iterator<LinkedHashSet<String>> queue_i = queue.iterator();
- LinkedHashSet<String> queue_set = queue_i.next();
- queue_i.remove(); // O(1) as well
- for (String queue_e : queue_set){ // O(m) , m - max group size
- 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]); // O(1)
- if (set != null)
- queue.add(set);
- mappingsStringContainer.get(i).remove(e_array[i]); // O(1) + O(1) -> O(1)
- }
- }
- res_set.add(queue_e); // O(1)
- items.remove(queue_e);// O(1)
- }
- }
- results.add(res_set); // O(1)
- }
- // sort. O(n log n)
- 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");
- writer.write(results.toString());
- for(int i = 0; i != results.size(); ++i) {
- writer.write("group #" + i + " : \n");
- for(String e : results.get(i)) {
- writer.write("\t" + e + "\n");
- }
- }
- } catch (FileNotFoundException e) {
- System.out.println("Could not write to file." + e.getMessage());
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement