如何访问arrayList

时间:2019-07-11 03:56:11

标签: java

我正在执行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);
      }
    }
}

4 个答案:

答案 0 :(得分:1)

您可以尝试

   for (Person  person : phonebook) 
    { 
        if(person.getName().equals(name)){
               return person.getNumber();
         }
    }

为此,您需要更改返回类型String searchNumber(String name) StringArrayList<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());
      }
    }
}