现在我想在我的电话簿类中实现一个方法,该方法将接收一个字符串(电话簿中的人的姓名),如果该人在电话簿中,则返回该号码。我尝试过多次尝试从Person对象调用getName()方法。
这就是我现在所拥有的:
人员类:
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";
}
}
答案 0 :(得分:2)
将此添加给您的人:
public boolean matchesName(String name) {
return this.name.toLowerCase().indexOf(name.toLowerCase()) > -1;
}
这种方法的作用是使两个名称都小写,以避免史密斯与史密斯匹配。然后它检查searchkey是否包含在人名中。
如果是这样,它返回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;
}
为什么不是地图?您可以根据自己的意愿修改搜索功能。
比如,如果你有斯堪的纳维亚名字,但人们输入美国搜索查询,那会怎么样?
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;
}
}