如何限制数组列表中对象的数量



我正在为下周的O.O.P.考试复习,我被一道题卡住了。这个问题基本上是给一个狗和跳蚤之间双向联系的例子。到目前为止,我有一只带跳蚤的狗。我遇到的问题是,"修改狗类,使狗对象最多只能容纳5个跳蚤对象(如果有超过5个跳蚤,打印"你的狗有太多跳蚤!")。下面是我到目前为止的代码:

Dog.java

import java.util.ArrayList;
public class Dog {
    private String name;
    private int age;
    private String address;
    ArrayList<Flea> fleas = new ArrayList<Flea>(); {
        if(fleas.size() > 5) {
             System.out.println("This dog has too many fleas!");
        }
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public void hostFlea(Flea flea) {
        fleas.add(flea);
    }
    public ArrayList<Flea> getDogFlea() {
         return fleas;
    }
    public String toString() {
        return name + " the Dog (aged " + age + ") has fleas. nThey are: " + fleas + ".";
    }   
}

Flea.java

public class Flea {
    private String name;
    private int age; 
    public Flea (String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String toString() {
        return name + " (aged " + age + ")";
    }
}

Test.java

public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog();
            dog.setName("Freddy");
            dog.setAddress("Cork");
            dog.setAge(5);
        Flea flea1 = new Flea("John", 1);
        dog.hostFlea(flea1);
        Flea flea2 = new Flea("Patrick", 3);        
        dog.hostFlea(flea2);
        Flea flea3 = new Flea("Alan", 7);
        dog.hostFlea(flea3);
        Flea flea4 = new Flea("Steven", 2);
        dog.hostFlea(flea4);
        Flea flea5 = new Flea("Charles", 5);
        dog.hostFlea(flea5);
        Flea flea6 = new Flea("Derek", 1);
        dog.hostFlea(flea6);
        Flea flea7 = new Flea("Kevin", 8);
        dog.hostFlea(flea7);
        System.out.println(dog);
    }
}
控制台:

Freddy the Dog(5岁)身上长了跳蚤。他们是:约翰(1岁)、帕特里克(3岁)、艾伦(7岁)、史蒂文(2岁)、查尔斯(5岁)、德里克(1岁)、凯文(8岁)。

在这里添加检查条件:

public void hostFlea(Flea flea) {
    if(fleas.size() >= 5) {
        System.out.println("This dog has too many fleas!");
    } else {
        fleas.add(flea);
    }
}

不在列表变量的定义处(正如您所做的),因为您刚刚添加了一个实例初始化块。

我猜你是被迫使用数组列表。因此,您必须确保除了您的狗类之外没有人修改列表。所以把List设为私有

private ArrayList<Flea> fleas = new ArrayList<Flea>();

返回一个副本,不公开getDogFlea方法中的原始List

public ArrayList<Flea> getDogFlea() {
     return new ArrayList(fleas); //use copy constructor to not expose original list
}

并在您的hostFlea方法中添加检查。

public void hostFlea(Flea flea) {
    if(fleas.size() == 5 ) {
        System.out.println("This dog has too many fleas!");
        return; //so the 6th element is not added
    }
    fleas.add(flea);
}

也许最后一个对于你的考试来说已经足够了,但是getter在实际的程序中会有一个问题,确保不超过5个元素

狗是假定添加跳蚤的公共方法是hostFlea,所以您需要更改:

public void hostFlea(Flea flea) {
    // If the dog already has at least 5 fleas, you can't add another
    if (fleas.size() >= 5) {
        System.out.println("Your dog has too many fleas!");
    } else {
        fleas.add(flea);
    }
}

然而,getDogFlea()返回内部的ArrayList,所以没有什么可以阻止一个确定的用户调用dog.getDogFlea().add(flea6)。为了防止这种行为,您可以复制数据:

public ArrayList<Flea> getDogFlea() {
     return new ArrayList<>(fleas);
}

或者,以放松API以返回List而不是ArrayList为"代价",教科书的解决方案将是使用Collections.unmodifiableList:

public List<Flea> getDogFlea() {
     return Collections.unmodifiableList(fleas);
}

在你的hostFlea方法中:-

在将Flea对象添加到Dog类中的fleas数组列表之前,只需检查这个数组列表的大小。

: -

public void hostFlea(Flea flea){
if(fleas.size() > 5) {
  System.out.println("This dog has too many fleas!");
        }
 else{
fleas.add(flea);
   }
}

相关内容

  • 没有找到相关文章

最新更新