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);
+ }
+}