我相信我已经完成了95%,唯一阻止我的是我必须将printInfo((的结果打印到一个元素中。
程序正在收集输入,输入基于项目是否为工厂。在输入并运行setter之后,我想访问printInfo((,并将其作为元素存储在myGarden数组中。
然后我将调用一个方法来打印对象数组的元素。这些元素将是来自植物和花类的printInfo((的信息。
更新:我删除了铸造,简单地改为,也修改了方法。删除print命令,因为它不适用于我们要做的事情,而是指定myGarden.get(i(调用元素。
package labpackage;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class PlantArrayListExample {
// TODO: Define a printArrayList method that prints an ArrayList of plant (or flower) objects
public static void printArrayList(ArrayList<Plant> myGarden) {
for (int i = 0; i < myGarden.size(); ++i) {
myGarden.get(i).printInfo();
}
}
public static void main(String[] args) {
Scanner scnr = new Scanner(System.in);
String input;
// TODO: Declare an ArrayList called myGarden that can hold object of type plant
ArrayList<Object> myGarden = new ArrayList<>();
// TODO: Declare variables - plantName, plantCost, colorOfFlowers, isAnnual
String plantName;
String plantCost;
String colorOffFlowers;
boolean isAnnual;
input = scnr.next();
while(!input.equals("-1")){
// TODO: Check if input is a plant or flower
if (input.contains("plant")) {
Plant plant = new Plant();
plantName = scnr.next();
plantCost = scnr.next();
plant.setPlantName(plantName);
plant.setPlantCost(plantCost);
System.out.println();
myGarden.add(plant);
// missing code to add print result as an element
}
if (!input.contains("plant")) {
Flower flower = new Flower();
plantName = scnr.next();
plantCost = scnr.next();
isAnnual = scnr.nextBoolean();
colorOffFlowers = scnr.next();
flower.setPlantName(plantName);
flower.setPlantCost(plantCost);
flower.setPlantType(isAnnual);
flower.setColorOfFlowers(colorOffFlowers);
System.out.println();
// missing code to add print result as an element
myGarden.add(flower);
}
input = scnr.next();
}
// TODO: Call the method printArrayList to print myGarden
printArrayList(myGarden);
}
}
package labpackage;
public class Plant {
protected String plantName;
protected String plantCost;
public void setPlantName(String userPlantName) {
plantName = userPlantName;
}
public String getPlantName() {
return plantName;
}
public void setPlantCost(String userPlantCost) {
plantCost = userPlantCost;
}
public String getPlantCost() {
return plantCost;
}
public void printInfo() {
System.out.println("Plant Information: ");
System.out.println(" Plant name: " + plantName);
System.out.println(" Cost: " + plantCost);
}
}
package labpackage;
public class Flower extends Plant {
private boolean isAnnual;
private String colorOfFlowers;
public void setPlantType(boolean userIsAnnual) {
isAnnual = userIsAnnual;
}
public boolean getPlantType(){
return isAnnual;
}
public void setColorOfFlowers(String userColorOfFlowers) {
colorOfFlowers = userColorOfFlowers;
}
public String getColorOfFlowers(){
return colorOfFlowers;
}
@Override
public void printInfo(){
System.out.println("Plant Information: ");
System.out.println(" Plant name: " + plantName);
System.out.println(" Cost: " + plantCost);
System.out.println(" Annual: " + isAnnual);
System.out.println(" Color of flowers: " + colorOfFlowers);
}
}
要打印植物或花朵信息,请更新printArrayList方法。不能将返回void的方法传递给";System.out.println";作为参数,必须直接调用该方法,因为它返回void。
public static void printArrayList(ArrayList<Plant> objList) {
for (i = 0; i < objList.size(); ++i) {
objList.get(i).printInfo();
}
}
您必须缩小可能类型的范围,而不是使用Object
作为集合中元素的类型(这是最通用的(。由于这里有很好的层次结构,所以可以使用基类。更换
ArrayList <Object> myGarden = new ArrayList();
带有
List<Plant> myGarden = new ArrayList<>();
您将能够调用printInfo()
方法,因为集合中的所有对象肯定至少是Plant
或该类的任何子类,这意味着它们都将具有printInfo()
方法。
public static void printArrayList(Collection<Plant> plants) {
for (Plant p : plants) {
p.printInfo();
}
}
使用Java Stream API 或更短
myGarden.stream().forEach(Plant::printInfo);
希望它能有所帮助!