gpt4 book ai didi

java - 在对象数组中搜索值

转载 作者:行者123 更新时间:2023-12-02 03:23:36 25 4
gpt4 key购买 nike

除了主类(人+电话簿)之外,我还有 2 个附加类。我将 Person 对象添加到我在 Phonebook 类中创建的 ArrayList 中。

现在我想在我的电话簿类中实现一个方法,该方法将接受一个字符串(电话簿中人员的姓名),如果该人在电话簿中则返回该号码。我尝试了多种方法,例如尝试从 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";
}




}

最佳答案

将此添加到您的个人中:

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

此方法的作用是使两个名字都小写,以避免 Smith 与 smith 不匹配。然后它检查搜索关键字是否包含在人名中。如果是,则返回 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;
}

为什么不是 map ?您可以根据自己的意愿修改其中的搜索功能。

例如,如果您有斯堪的纳维亚名字,但人们输入美国搜索查询怎么办:

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

关于java - 在对象数组中搜索值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39292133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com