我正在执行MOOC,应该返回与名称相关联的数字。号码名称组合保存在一个名为Phonebook的对象中,该对象是一个ArrayList。 arrayList包含我创建的类Person的信息。我需要在电话簿对象上执行getNumber(),但是由于getNumber()仅适用于Person类型的对象,所以不能。
package problem94_phonebook;
import java.util.ArrayList;
public class Phonebook {
private ArrayList<Person> phonebook;
public Phonebook(){
this.phonebook = new ArrayList<Person>();
}
public String searchNumber(String name){
if (this.phonebook.contains(name)){
return this.phonebook.Person.getNumber(); // here is the problem
}
}
}
package problem94_phonebook;
import java.util.ArrayList;
public class Person {
private String Name;
private String Numb;
private ArrayList<String> Phonebook;
public Person(String name, String numb){
this.Name = name;
this.Numb = numb;
this.Phonebook = new ArrayList<String>();
}
public String getName() {
return Name;
}
public String getNumber() {
return Numb;
}
public String toString(){
return this.Name +" " +"nummber: " + this.Numb;
}
public void changeNumber(String newNumber){
this.Numb = newNumber;
}
public void add(String name, String number){
this.Phonebook.add(name);
this.Phonebook.add(number);
}
public void printAll(){
for(String i : this.Phonebook){
System.out.println(i);
}
}
}
答案 0 :(得分:1)
您可以尝试
for (Person person : phonebook)
{
if(person.getName().equals(name)){
return person.getNumber();
}
}
为此,您需要更改返回类型String searchNumber(String name)
String
至ArrayList<String>
答案 1 :(得分:1)
您可以为此使用流,但是如果列表中有两个相同的名称,则只会出现第一个数字
return this.phonebook.stream()
.filter(p -> p.getName().equals(name))
.map(Person::getNumber)
.findFirst().orElse(null);
答案 2 :(得分:0)
查看代码后,进行如下更改,以获取人的名字编号:
public String searchNumber(String name){
for(int i=0;i<this.phonebook.size();i++){
if(this.phonebook.get(i).getName().equals(name)){
return this.phonebook.get(i).getNumber();
}
}
return null;
}
我希望您的问题得到解决,如果有需要,请告诉我。
答案 3 :(得分:-1)
编辑
.contains
自.contains
当且仅当此列表包含至少一个元素(e == null?e == null:o.equals(e))时,返回true。
(More info on how .contains works here)
这意味着除非您的类重写.equals
方法以比较该部分的名称-> o.equals(e)将始终返回false,因为.equals
正在比较两个不同的对象。 (more info on how .equals work here)
因此,如果您真的想使用.contains
,则需要在.equals
类中重写Person
方法。但这仍然无法正常工作,因为第二个问题是您访问数组列表的元素错误。
但是由于您是初学者,所以建议您尝试将方法更改为此:
public ArrayList<String> searchNumber(String name){
ArrayList<String> result = new ArrayList<>(); // list incase of persons with the same name
for (Person p : phonebook){ // iterate through the array
if (p.getName().equals(name)){ // check if the current person's name is equal to anme
result.add(p.getNumber()); // add the person's phone number
}
}
return result ;
}
我还注意到您在Phonebook
类中有一个属性Person
。它只是一个字符串数组,但我认为最好将其更改为Phonebook
数组,以便可以使用类Phonebook
。这将是您的新Person
类。
package problem94_phonebook;
import java.util.ArrayList;
import Phonebook;
public class Person {
private String Name;
private String Numb;
private ArrayList<Phonebook> phonebook; // updated
public Person(String name, String numb){
this.Name = name;
this.Numb = numb;
this.phonebook= new ArrayList<Phonebook>();// updated
}
public String getName() {
return Name;
}
public String getNumber() {
return Numb;
}
public String toString(){
return this.Name +" " +"nummber: " + this.Numb;
}
public void changeNumber(String newNumber){
this.Numb = newNumber;
}
public void add(Person personToBeAdded){ // changed
boolean isPresent = false;
// check if person to be added is already in the phonebook to avoid duplicates
for (Person person:this.phonebook){
if (person.getName().equals(personToBeAdded.getName()) && person.getNumber().equals(personToBeAdded.getNumber())){
isPresent = true;
break;
}
}
if (!isPresent){
this.phonebook.add(personToBeAdded);
}
}
public void printAll(){
for(Person person : this.phonebook){
System.out.println(person.toString());
}
}
}