使用数组列表<Object>功能存储来自方法的数组



我相信我已经完成了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);

希望它能有所帮助!

最新更新