在对象数组中搜索值

时间:2016-09-02 12:11:07

标签: java string arraylist methods

除了主要(人+电话簿)之外,我还有2个额外的classess。我将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"; 
    }




}

1 个答案:

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