使用 ArrayList<Object> 特性从方法中存储数组

Using the ArrayList<Object> feature to store Array from Method

我相信我已经完成了大约 95%,唯一阻止我的是我必须将 printInfo() 的结果打印到一个元素中。

程序正在收集输入,输入基于项目是否为植物。输入输入后,setter 为 运行,我想访问 例如,来自 plant 的 printInfo(),并将其作为一个元素存储在 myGarden 数组中。

然后我将调用一个打印对象数组元素的方法。这些元素将是来自植物和花朵的 printInfo() 的信息 class.

update: 我去掉了casting,简单的改成了,也修改了方法。删除打印命令,因为它对我们正在尝试做的事情不起作用,而是分配 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 方法。您不能将 returns 无效的方法作为参数传递给“System.out.println”,您必须直接调用该方法,因为它 returns 无效。

public static void printArrayList(ArrayList<Plant> objList) {
    for (i = 0; i < objList.size(); ++i) {
       objList.get(i).printInfo();
    }
}

您必须缩小可能类型的范围,而不是使用 Object 作为集合中的元素类型(这是最通用的)。因为你在这里有很好的层次结构,你可以使用 base class。替换

ArrayList <Object> myGarden = new ArrayList();

List<Plant> myGarden = new ArrayList<>();

并且您将能够调用 printInfo() 方法,因为集合中的所有对象肯定至少是 Plant 或 class 的任何子 class意味着他们都有 printInfo() 方法。

public static void printArrayList(Collection<Plant> plants) {
    for (Plant p : plants) {
        p.printInfo();  
    }
}

或更短使用 Java 流 API

myGarden.stream().forEach(Plant::printInfo);

希望对您有所帮助!