diff --git a/.idea/misc.xml b/.idea/misc.xml index a165cb3..e208459 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index a0733a5..f6c11bc 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,7 @@ - + \ No newline at end of file diff --git a/.idea/project.iml b/.idea/project.iml deleted file mode 100644 index 47baa8c..0000000 --- a/.idea/project.iml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/all.txt b/all.txt new file mode 100644 index 0000000..15d9ad6 --- /dev/null +++ b/all.txt @@ -0,0 +1,57 @@ +Dwight Joseph djo@gmail.com +Rene Webb webb@gmail.com +Katie Jacobs +Erick Harrington harrington@gmail.com +Myrtle Medina +Erick Burgess +Kate Kate +Kate Kate kate@kate +Kate Kate katekate@mail.ru +Kate Jess kate@jess +Kate Jess +Jess Kate kate@mail.com +Nora Frye nora_frye@mail.com +Carlee Long carlee_long@mail.com +Marissa Sanders marissa_sanders@mail.com +Raquel Nunez +Gabrielle Hernandez + Reed Vaughn +Drew Winters +Courtney Long courtney_long@mail.com +Braydon Sanders braydon_sanders@mail.com +Russell Nunez russell_nunez@mail.com +Cherish Hernandez cherish_hernandez@mail.com +Gunnar Vaughn +Nora Winters nora@winters +Carlee Walter +Marissa Frye +Raquel Long +Gabrielle Sanders gabrielle_sanders@mail.com +Reed Nunez reed_nunez@mail.com +Drew Hernandez drew_hernandez@mail.com +Courtney Vaughn courtney_vaughn@mail.com +Braydon Winters braydon_winters@mail.com +Russell Long +Cherish Sanders cherish_sanders@mail.com +Gunnar Nunez gunnar_nunez@mail.com +Imani Hernandez imani_hernandez@mail.com +Nora Vaughn nora_vaughn@mail.com +Nora Winters +Marissa Walter +Raquel Crosby +Gabrielle Alexander +Reed Calderon +Russell Mclean +Courtney Klein courtney_klein@mail.com +Braydon Russo braydon_russo@mail.com +Russell Mclean russell_mclean@mail.com +Cherish Fox cherish_fox@mail.com +Gunnar Clements +Imani Hammond imani_hammond@mail.com +Harley Berg harley_berg@mail.com +Kathryn Hernandez +Jonah Vaughn +Nehemiah Winters +Talon Walter +Toby Crosby toby_crosby@mail.com +Jaron Fox jaron_fox@mail.com \ No newline at end of file diff --git a/src/simpleSearchEngine/InvertedIndex.java b/src/simpleSearchEngine/InvertedIndex.java new file mode 100644 index 0000000..99f2393 --- /dev/null +++ b/src/simpleSearchEngine/InvertedIndex.java @@ -0,0 +1,46 @@ +package simpleSearchEngine; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +/** + * Created by DIMA, on 21.01.2019 + */ +class InvertedIndex { + + static Map> buildInvertedIndex(List persons){ + Map> map = new TreeMap<>(); + for(int i = 0; i < persons.size(); i++){ + Person p = persons.get(i); + String[] personsFields = {p.getFirstName(), p.getSecondName(), p.getEmail()}; + int len = p.getEmail() == null ? 2 : 3; + for(int f = 0; f < len; f++ ){ + if(map.containsKey(personsFields[f])){ + map.get(personsFields[f]).add(i); + }else { + List indexList = new ArrayList<>(); + indexList.add(i); + map.put(personsFields[f],indexList); + } + } + } + return map; + } + + static void printInvertedIndexes(Map> invertedIndexes){ + for(Map.Entry> entry : invertedIndexes.entrySet()){ + System.out.println(entry.getKey() + " -> " + entry.getValue()); + } + } + + static void printOnlyLongInvertedIndexes(Map> invertedIndexes){ + for(Map.Entry> entry : invertedIndexes.entrySet()){ + if(entry.getValue().size() > 3){ + System.out.println(entry.getKey() + " -> " + entry.getValue()); + } + + } + } +} diff --git a/src/simpleSearchEngine/Main.java b/src/simpleSearchEngine/Main.java index b8ecb08..585aafe 100644 --- a/src/simpleSearchEngine/Main.java +++ b/src/simpleSearchEngine/Main.java @@ -1,7 +1,60 @@ package simpleSearchEngine; +import java.util.List; +import java.util.Map; +import java.util.Scanner; + public class Main { + //X:\Programming\IdeaProjects\simple-search-engine\all.txt + private static Scanner scanner; public static void main(String[] args) { - System.out.print("Hello world!"); + scanner = new Scanner(System.in).useDelimiter("\n"); + List allPersons = PersonsGetter.getAllPersonsFromFile(scanner); + Map> invertedIndex = InvertedIndex.buildInvertedIndex(allPersons); + //InvertedIndex.printInvertedIndexes(invertedIndex); + //System.out.println("======== Long Indexes ================"); + //InvertedIndex.printOnlyLongInvertedIndexes(invertedIndex); + int command; + Printer.printMenu(); + while ((command = getCommand()) != 0){ + if (command == 2){ + System.out.println("=== List of people ==="); + Printer.printAllPersons(allPersons); + System.out.println(); + }else if(command == 1){ + Processor.processQueries(allPersons, invertedIndex, scanner); + }else { + System.out.println("Incorrect option! Try again."); + continue; + } + Printer.printMenu(); + } + System.out.println("Bye!"); + scanner.close(); + System.exit(0); + } + + private static int getCommand(){ + //Scanner scannerCommand = new Scanner(System.in); + while (true){ + String commandLine = scanner.next(); + if(commandLine.toCharArray().length != 1 || !Character.isDigit(commandLine.charAt(0))){ + System.out.println("Please inset a number!"); + Printer.printMenu(); + }else if(Integer.parseInt(commandLine) >=0 && Integer.parseInt(commandLine) <= 2){ + //scanner.close(); + return Integer.parseInt(commandLine); + }else { + System.out.println("Incorrect option! Try again."); + Printer.printMenu(); + } + } } + + + + + + + } \ No newline at end of file diff --git a/src/simpleSearchEngine/Mode.java b/src/simpleSearchEngine/Mode.java new file mode 100644 index 0000000..bd67b45 --- /dev/null +++ b/src/simpleSearchEngine/Mode.java @@ -0,0 +1,9 @@ +package simpleSearchEngine; + +/** + * Created by DIMA, on 23.01.2019 + */ +public enum Mode { + ALL, ANY, NONE; + +} diff --git a/src/simpleSearchEngine/Person.java b/src/simpleSearchEngine/Person.java new file mode 100644 index 0000000..5cb38da --- /dev/null +++ b/src/simpleSearchEngine/Person.java @@ -0,0 +1,37 @@ +package simpleSearchEngine; + +/** + * Created by DIMA, on 17.01.2019 + */ +class Person { + private String firstName; + private String secondName; + private String email; + + Person(String data) { + String[] items = data.split(" +"); + if(items.length == 2){ + this.firstName = items[0]; + this.secondName = items[1]; + this.email = null; + }else if(items.length == 3){ + this.firstName = items[0]; + this.secondName = items[1]; + this.email =items[2]; + }else { + System.out.println("Wrong data"); + } + } + + String getFirstName() { return firstName; } + String getSecondName() { return secondName; } + String getEmail() { return email; } + + @Override + public String toString() { + if(email == null){ + return firstName + " " + secondName; + } + return firstName + " " + secondName + " " + email; + } +} diff --git a/src/simpleSearchEngine/PersonsGetter.java b/src/simpleSearchEngine/PersonsGetter.java new file mode 100644 index 0000000..1f0844c --- /dev/null +++ b/src/simpleSearchEngine/PersonsGetter.java @@ -0,0 +1,67 @@ +package simpleSearchEngine; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +/** + * Created by DIMA, on 21.01.2019 + */ +class PersonsGetter { + static List getAllPersonsFromFile(Scanner scanner){ + //Scanner scanner = new Scanner(System.in); + while (true){ + List allPersons = new ArrayList<>(); + System.out.println("Enter path to file"); + String path = scanner.next(); + File dataFile = new File(path); + try(FileReader fileReader = new FileReader(dataFile)){ + Scanner scannerFile = new Scanner(fileReader).useDelimiter("\n"); + String data; + while (scannerFile.hasNextLine()){ + data = scannerFile.nextLine().trim(); + //System.out.println(data); + allPersons.add(new Person(data)); + } + scannerFile.close(); + }catch (FileNotFoundException e){ + System.out.println("File not found. Please check path"); + continue; + }catch (IOException e2){ + System.out.println("ioexceprion " + e2.getMessage()); + continue; + } + //scanner.close(); + return allPersons; + } + } + + private static List getAllPersons(Scanner scanner){ + //Scanner scanner = new Scanner(System.in); + List allPersons = new ArrayList<>(); + System.out.println("Enter the number of people:"); + int countPeople = scanner.nextInt(); + System.out.println("Enter all people:"); + for(int i = 0; i < countPeople; i++){ + allPersons.add(new Person(scanner.next())); + } + //scanner.close(); + return allPersons; + } + + static List getPersonFromListByIndexes(List allPersons, List indexesPerson){ + if(indexesPerson == null){ + return null; + } + List findedPersons = new ArrayList<>(); + for(Integer index : indexesPerson){ + findedPersons.add(allPersons.get(index)); + } + return findedPersons; + + } +} diff --git a/src/simpleSearchEngine/Printer.java b/src/simpleSearchEngine/Printer.java new file mode 100644 index 0000000..4d31f55 --- /dev/null +++ b/src/simpleSearchEngine/Printer.java @@ -0,0 +1,19 @@ +package simpleSearchEngine; + +import java.util.List; + +/** + * Created by DIMA, on 21.01.2019 + */ +class Printer { + static void printAllPersons(List personList){ + personList.forEach(System.out :: println); + } + + static void printMenu(){ + System.out.println("=== Menu ===\n" + + "1. Find a person\n" + + "2. Print all people\n" + + "0. Exit"); + } +} diff --git a/src/simpleSearchEngine/Processor.java b/src/simpleSearchEngine/Processor.java new file mode 100644 index 0000000..fc4bc84 --- /dev/null +++ b/src/simpleSearchEngine/Processor.java @@ -0,0 +1,42 @@ +package simpleSearchEngine; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Scanner; +import java.util.stream.Collectors; + +/** + * Created by DIMA, on 21.01.2019 + */ +class Processor { + static void processQueries(List allPersons, Map> invertedIndexes, Scanner scanner){ + System.out.println("Select a matching strategy: ALL, ANY, NONE"); + String stringMode; + List modes =Arrays.stream(Mode.values()).map(Mode::name).map(String::toLowerCase).collect(Collectors.toList()); + + while (!modes.contains(stringMode = scanner.next().toLowerCase())){ + System.out.println("Wrong Strategy. Select a matching strategy: ALL, ANY, NONE"); + } + + Mode mode = Mode.valueOf(stringMode.toUpperCase()); + System.out.println("Enter a name or email to search all suitable people."); + String targetData = scanner.next(); + List findedIndexes = Searcher.getResultIndexedList(invertedIndexes, targetData, mode); + //String[] fields = targetData.split(" "); + List founded = PersonsGetter.getPersonFromListByIndexes(allPersons, findedIndexes); + + if(founded == null || founded.size() == 0){ + System.out.println("For query: " + targetData + " nothing was found"); + }else if(founded.size() == 1){ + System.out.println("1 person found:"); + System.out.println(founded.get(0)); + }else { + System.out.println(founded.size() + " persons found:"); + for(Person p : founded){ + System.out.println(p); + } + } + System.out.println(); + } +} diff --git a/src/simpleSearchEngine/Searcher.java b/src/simpleSearchEngine/Searcher.java new file mode 100644 index 0000000..c24f05d --- /dev/null +++ b/src/simpleSearchEngine/Searcher.java @@ -0,0 +1,114 @@ +package simpleSearchEngine; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * Created by DIMA, on 18.01.2019 + */ +class Searcher { + private static List searchByOneField(List persons, String data){ + List retrievedPersons = new ArrayList<>(); + for(Person p : persons){ + if(p.getFirstName().equalsIgnoreCase(data) || + p.getSecondName().equalsIgnoreCase(data) || + p.getEmail() != null && p.getEmail().equalsIgnoreCase(data)){ + retrievedPersons.add(p); + } + } + return retrievedPersons; + } + + static List search(List persons, String[] data){ + if(data.length == 1){ + return searchByOneField(persons, data[0]); + } + List retrievedPersons = new ArrayList<>(); + for(Person p : persons){ + boolean[] blockedFields = {false, false, false}; + int countBlockedFields = 0; + for(String s : data){ + int result = compareField(p, s, blockedFields); + if(result != -1){ + blockedFields[result] = true; + countBlockedFields++; + }else { + break; + } + } + if(data.length == countBlockedFields){ + retrievedPersons.add(p); + } + } + return retrievedPersons; + } + + private static int compareField(Person p, String data, boolean[] blocked){ + if(!blocked[0] && p.getFirstName().equalsIgnoreCase(data))return 0; + if(!blocked[1] && p.getSecondName().equalsIgnoreCase(data))return 1; + if(!blocked[2] && p.getEmail() != null && p.getEmail().equalsIgnoreCase(data))return 2; + return -1; + } + + private static List getIndexes (Map> invertedIndexes, String field){ + for(Map.Entry> entry : invertedIndexes.entrySet()){ + if(field.equalsIgnoreCase(entry.getKey())){ + return entry.getValue(); + } + } + return null; + } + + static List getResultIndexedList(Map> invertedIndexes, String data, Mode mode){ + if(data == null) { + System.out.println("No data"); + return null; + } + String[] fields = data.split(" +"); + if(fields.length == 0){ + System.out.println("You insert only spaces"); + return null; + } + if(getIndexes(invertedIndexes, fields[0]) == null){ + return null; + } + List first = new ArrayList<>(getIndexes(invertedIndexes, fields[0])); + + for(int i = 1; i < fields.length; i++){ + List nextList; + if(getIndexes(invertedIndexes, fields[i]) == null){ + if(mode.name().equalsIgnoreCase("ALL")){ + return null; + }else { + nextList = new ArrayList<>(); + } + + }else { + nextList = new ArrayList<>(getIndexes(invertedIndexes, fields[i])); + } + + if(mode.name().equalsIgnoreCase("ALL")){ + first.retainAll(nextList); + }else { + first.addAll(nextList); + } + + } + //delete duplicates + first = new ArrayList<>(new HashSet<>(first)); + if(mode.name().equalsIgnoreCase("NONE")){ + List listAllIndexes = invertedIndexes.values().stream().flatMap(List::stream).collect(Collectors.toList()); + listAllIndexes = new ArrayList<>(new HashSet<>(listAllIndexes)); + listAllIndexes.removeAll(first); + return listAllIndexes; + } + return first; + } + + + + +} diff --git a/src/test/Test.java b/src/test/Test.java new file mode 100644 index 0000000..50c0daf --- /dev/null +++ b/src/test/Test.java @@ -0,0 +1,12 @@ +package test; + +/** + * Created by DIMA, on 21.01.2019 + */ +public class Test { + public static void main(String[] args) { + String a = " df df defdf "; + System.out.println(a.trim().split(" +").length); + System.out.println(a.split(" ").length); + } +}