2016-09-02 3 views
0

У меня есть 2 дополнительных класса помимо основного (Person + Phonebook). Я добавляю объекты Person в ArrayList, которые я создал в своем классе Phonebook.Поиск значения в массиве объектов

Теперь я хочу внедрить метод в классе Phonebook, который примет строку (имя человека в телефонной книге) и вернет номер, если человек находится в телефонной книге. Я пробовал несколько вещей, например, пытаться вызвать метод getName() из объекта Person.

Это то, что я прямо сейчас:

Person класс:

public class Person { 
    private String name; 
    private String number; 


    public Person(String name, String number) { 
     this.name = name; 
     this.number = number;      
    } 

    public String getName() { 
     return this.name; 
    } 

    public String getNumber() { 
     return this.number; 
    } 

    public void changeNumber(String newNumber) { 
     this.number = newNumber; 
    } 

    public String toString() { 
     return getName() + " " + "number: " + getNumber(); 
    } 

} 

Телефонная книга класс:

import java.util.ArrayList; 

public class Phonebook { 
    private ArrayList<Person> person; 
    public Phonebook() { 
     this.person = new ArrayList<Person>(); 
    } 


    public void add(String name, String number) { 


    Person newPerson = new Person(name, number); 
    person.add(newPerson); 

    } 
    public void printAll() { 
      for (Person prs : person) { 
       System.out.println(prs); 
      } 
    } 

    public String searchNumber(String name) { 
     if (person.contains(name)) { 
      return person.toString(); 
     } 
      return "number not know"; 
    } 




} 
+5

хорошо, вы не можете просто сравнить 'Person' и' String' и ожидать Java, чтобы знать, где логическая равенство было бы;) – SomeJavaGuy

+3

Вы можете использовать карту вместо списка. Таким образом, вы можете искать человека без повторения в списке. Ключом карты будет имя человека и значение объекта Person. –

ответ

2

Добавить это к вашему лицу:

public boolean matchesName(String name) { 
    return this.name.toLowerCase().indexOf(name.toLowerCase()) > -1; 
} 

Что этот метод делает, делает b oth именам нижний регистр, чтобы избежать того, что Смит не подходит к кузнецу. Затем он проверяет, содержится ли ключ поиска в имени пользователя. если так, то он возвращает true. если он не возвращает false. Так smith будет соответствовать на john smith, но и на jake Smithsson

, а затем в вашем методе поиска

public String searchNumber(String name) { 
    for (Person prs : person) { 
      if(prs.matchesName(name)) { 
      return prs.toString(); 
      } 
    } 
    return "number not known"; 
} 

Вам нужно перебирать список, чтобы найти их.

Если у вас меньше 10.000, это довольно быстро. Если вы хотите добавить больше имен, вам нужно начать рассматривать такие вещи, как индексирование или хранение базы данных.

Но это возвращает только один человек.

Предпочитаемый срок доставки всех матчей.

public List<Person> searchNumber(String name) { 
    ArrayList<Person> matchlist = new ArrayList<Person>(); 
    for (Person prs : person) { 
      if(prs.matchesName(name)) { 
      matchlist.add(prs); 
      } 
    } 
    return matchlist; 
} 

Почему нет карты? Вы можете изменить функциональность поиска в соответствии с вашими пожеланиями.

Как, что, если у вас есть скандинавские имена, но люди типа в американских searchqueries:

class AccentedNamePerson extends Person { 
    private String normalised; 
    private String normalisedName() { 
     if(normalised != null) return normalised; 
     normalised = Normalizer.normalize(string, Normalizer.Form.NFD); 
     /** assuming input is in unicode. if ascii use .replaceAll("[^\\p{ASCII}]", ""); **/ 
     normalised = normalised.replaceAll("\\p{M}", ""); 
     return normalised; 
    } 
    @Override 
    public boolean matchesName(String name) { 
     String 
     return this.normalisedName().toLowerCase().indexOf(name.toLowerCase()) > -1; 
    } 
} 
+1

Это нормально, но с использованием карты, поскольку предлагаемый @Benat более эффективен. –

+0

Эй, большой ответ с большим объяснением. Очень благодарен, спасибо. – Zariadres

+0

Да, но с помощью этого решения вы можете выполнять частичные совпадения и изменять экземпляр .matchesName для каждого человека. Возможно, вам нужны специальные настройки для скандинавских имен, utf8, datasource polling и т. Д. ... – Tschallacka

Смежные вопросы