Добрый день! Буду признателен, если "разжуете" и по возможности поможете с кодом вот в такой задачке:
1. Сначала требуется создать два класса: Person, PersonList
Класс Person имеет следующие свойства: firstname, lastname, age
Класс PersonList содержит список персон и следующие методы:
void add (Person p) - добавляет Person p
Person findPerson (Search s)- находит person соответственно критерию поиска(ниже)
Iterator <Person> (Search s) находит все person, которые соответствуют критерию поиска и возвращает iterator с найденными person.
2. Стратегии поиска:
Класс Search определяет стратегию, чтобы решить, соответствует ли объект person определенному критерию поиска.
Интерфейс стратегии:
interface Search {
boolean searchmatches (Person p);
}
метод searchmatches() возвращает true, когда person p соответствует определенному критерию поиска.
Список стратегий:
- Поиск по имени
- Поиск по имени и фамилии
- Поиск по начальной букве в имени
- Поиск по людям, которые старше 18 лет
- Поиск по определенному промежутку в возрасте (например, люди между 21 и 48 годами)
3. Композиция:
Класс CompositionStrategy. Эта стратегия содержит список с вышеперечисленными стратегиями и содержит два подкласса:
- ANDComposition- возвращает метод searchmatches() в значении true, если выполнены все критерии поиска.
- ORComposotition - возвращает метод searchmatches() в значении true, если выполнен как минимум один критерий поиска.
Вопросы у меня следующие:
Как реализовать поиск с "прицепленными стратегиями"? Проблема в том, что по отдельности я реализацию конкретно итератора как такового и прочая понимаю, но не могу это дело пока "собрать" и пытаюсь понять, как.
У меня проблема в понимании, как связать Search s с поиском, итератором и классами стратегий и как реализовать поиск с учетом, что данные разнородные (имя и фамилия - string, возраст должен высчитываться как int)
С уважением и заранее спасибо
За код не пинайте, все в начальной стадии, когда умом понятно, что именно требуется, но пока не хватает опыта реализации, что и пытаюсь понять, так как начал и запутался.
Main:
Java |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| import java.util.Scanner;
public class Main {
public static void main(String[] args){
System.out.println(" Search:");
System.out.println("1. First name search");
System.out.println("2. Last name search");
System.out.println("3. Search by first letter");
System.out.println("4. Search by age >18");
System.out.println("5. Age range search");
Scanner scan = new Scanner(System.in);
int choice = scan.nextInt();
switch (choice){
case 1: //return new FirstnameSearch();
case 2: //return new FirstLastnameSearch();
case 3: //return new FirstLetterSearch();
case 4: //return new MinAgeSearch();
case 5: //return new RangeSearch();
}
}
} |
|
Person
Java |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
| import java.util.ArrayList;
public class Person extends ArrayList<Person> {
String firstname;
String lastname;
int age;
public Person(String firstname, String lastname, int age) {
this.firstname = firstname;
this.lastname = lastname;
this.age = age;
}
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
} |
|
Java |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
| import java.util.ArrayList;
import java.util.Iterator;
public class PersonList extends Person {
private Person person;
private ArrayList <Person> personlist = new ArrayList <>();
public PersonList(String firstname, String lastname, int age) {
super(first, lastname, age);
}
void add ( Person p){
personlist.add(p);
}
Person findPerson (Search s) {
}
/*
public Iterator <Person> personIterator (Search s) {
while (personIterator(s.searchmatches(person) == )
return ;
*/
} |
|
Java |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| public class FirstNameSearch implements Search{
@Override
public boolean searchmatches(Person p) {
if (p != null) {
for (int i = 0; i < p.size(); i++) {
Person person = this.p.get(i);
if(person.getFirstname() == this.firstname){
return true;
}
}
}
else return false;
}
} |
|
Java |
1
2
3
4
5
| public interface Search {
boolean searchmatches (Person p);
} |
|
Остальные стратегии еще не реализовал, как и итератор, потому он в комментарии, потому что запутался, как именно. Буду благодарен за подсказки.
Добавлено через 7 часов 6 минут
Дописал немного код и остались вопросы:
1. Как реализовать итератор?
2. Как вывести значения, соответствуют ли данные критериям поиска?
3. Как это дело вывести на консоль?
Если можно, проверьте, пожалуйста код) Я там запутался малость)) Буду благодарен за любую помощь
main
Java |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| public class Main {
public static void main(String[] args){
Search firstname = new FirstNameSearch();
Search firstlastname = new FirstLastnameSearch();
Search minage = new MinAgeSearch();
Search firstletter = new FirstLetterSearch();
Search range = new RangeSearch();
System.out.println("First name search results:");
PersonList.printPersons(firstname.);
System.out.println("First and last name search results:");
PersonList.printPersons(firstlastname) ; //пофиксить
System.out.println("First letter search results: ");
PersonList.printPersons(firstletter); //пофиксить
System.out.println("Minimal age search");
PersonList.printPersons(minage); //пофиксить
System.out.println("Range search");
PersonList.printPersons(range); //пофиксить
}
} |
|
класс personList
Java |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| import java.util.ArrayList;
import java.util.Iterator;
public class PersonList extends Person {
private ArrayList <Person> person = new ArrayList <>();
public PersonList(String firstname, String lastname, int age) {
super(firtname, lastname, age);
}
void add ( Person p){
person.add(new Person("Annika", "Baumgartner", 12));
person.add(new Person("Max", "Schmidt", 36));
person.add(new Person("Alex", "Smith", 43));
person.add(new Person("Alexandra", "Miller", 23));
}
Person FindPerson (Search s) {
}
public Iterator <Person> personIterator (Search s) {
while (
return ;
}
public static void printPersons(Person p){
for (Person person: p){
System.out.println("Person : [ First name : " + person.getFirstname() + ", Last name : " + person.getLastname()
+ "Age : " +person.getAge());
}
}
} |
|
Интерфейс Search
Java |
1
2
3
| public interface Search {
boolean searchmatches(Person p);
} |
|
Стратегия FirstNameSearch
Java |
1
2
3
4
5
6
7
8
9
10
11
12
13
| public class FirstNameSearch implements Search {
@Override
public boolean searchmatches(Person p) {
for (Person person : p) {
if (person.getFirstname().startsWith("S")) {
return true;
}
}
return false;
}
} |
|
Стратегия FirstLastNameSearch
Java |
1
2
3
4
5
6
7
8
9
10
11
12
| public class FirstLastNameSearch implements Search {
@Override
public boolean searchmatches(Person p) {
for (Person person : p) {
if (person.getFirstname().equalsIgnoreCase("Alex")&& person.getLastname().equalsIgnoreCase("Smith")){
return true;
}
}
return false;
}
} |
|
Стратегия MinAgeSearch
Java |
1
2
3
4
5
6
7
8
9
10
11
12
| public class MinAgeSearch implements Search {
@Override
public boolean searchmatches(Person p) {
for (Person person : p) {
if (person.getAge() >18){
return true;
}
}
return false;
}
} |
|
Стратегия FirstletterSearch
Java |
1
2
3
4
5
6
7
8
9
10
11
| public class FirstletterSearch implements Search {
@Override
public boolean searchmatches(Person p) {
for (Person person : p) {
if (person.getFirstname().startsWith("S")){
return true;
}
}
return false;
}
} |
|
Стратегия RangeSearch
Java |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| public class RangeSearch implements Search {
@Override
public boolean searchmatches(Person p) {
for (Person person : p) {
if (person.getAge() > 18 && person.getAge() < 47) {
return true;
}
}
return false;
}
} |
|
Добавлено через 57 секунд
Дописал немного код и остались вопросы:
1. Как реализовать итератор?
2. Как вывести значения, соответствуют ли данные критериям поиска?
3. Как это дело вывести на консоль?
Если можно, проверьте, пожалуйста код) Я там запутался малость)) Буду благодарен за любую помощь
main
Java |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| public class Main {
public static void main(String[] args){
Search firstname = new FirstNameSearch();
Search firstlastname = new FirstLastnameSearch();
Search minage = new MinAgeSearch();
Search firstletter = new FirstLetterSearch();
Search range = new RangeSearch();
System.out.println("First name search results:");
PersonList.printPersons(firstname.);
System.out.println("First and last name search results:");
PersonList.printPersons(firstlastname) ; //пофиксить
System.out.println("First letter search results: ");
PersonList.printPersons(firstletter); //пофиксить
System.out.println("Minimal age search");
PersonList.printPersons(minage); //пофиксить
System.out.println("Range search");
PersonList.printPersons(range); //пофиксить
}
} |
|
класс personList
Java |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| import java.util.ArrayList;
import java.util.Iterator;
public class PersonList extends Person {
private ArrayList <Person> person = new ArrayList <>();
public PersonList(String firstname, String lastname, int age) {
super(firtname, lastname, age);
}
void add ( Person p){
person.add(new Person("Annika", "Baumgartner", 12));
person.add(new Person("Max", "Schmidt", 36));
person.add(new Person("Alex", "Smith", 43));
person.add(new Person("Alexandra", "Miller", 23));
}
Person FindPerson (Search s) {
}
public Iterator <Person> personIterator (Search s) {
while (
return ;
}
public static void printPersons(Person p){
for (Person person: p){
System.out.println("Person : [ First name : " + person.getFirstname() + ", Last name : " + person.getLastname()
+ "Age : " +person.getAge());
}
}
} |
|
Интерфейс Search
Java |
1
2
3
| public interface Search {
boolean searchmatches(Person p);
} |
|
Стратегия FirstNameSearch
Java |
1
2
3
4
5
6
7
8
9
10
11
12
13
| public class FirstNameSearch implements Search {
@Override
public boolean searchmatches(Person p) {
for (Person person : p) {
if (person.getFirstname().startsWith("S")) {
return true;
}
}
return false;
}
} |
|
Стратегия FirstLastNameSearch
Java |
1
2
3
4
5
6
7
8
9
10
11
12
| public class FirstLastNameSearch implements Search {
@Override
public boolean searchmatches(Person p) {
for (Person person : p) {
if (person.getFirstname().equalsIgnoreCase("Alex")&& person.getLastname().equalsIgnoreCase("Smith")){
return true;
}
}
return false;
}
} |
|
Стратегия MinAgeSearch
Java |
1
2
3
4
5
6
7
8
9
10
11
12
| public class MinAgeSearch implements Search {
@Override
public boolean searchmatches(Person p) {
for (Person person : p) {
if (person.getAge() >18){
return true;
}
}
return false;
}
} |
|
Стратегия FirstletterSearch
Java |
1
2
3
4
5
6
7
8
9
10
11
| public class FirstletterSearch implements Search {
@Override
public boolean searchmatches(Person p) {
for (Person person : p) {
if (person.getFirstname().startsWith("S")){
return true;
}
}
return false;
}
} |
|
Стратегия RangeSearch
Java |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| public class RangeSearch implements Search {
@Override
public boolean searchmatches(Person p) {
for (Person person : p) {
if (person.getAge() > 18 && person.getAge() < 47) {
return true;
}
}
return false;
}
} |
|