为数组中的每个元素添加变量的Java方法

问题描述

使用下面的 UML 类图,我试图将类型为 Building 的每个 Dwelling 的人口相加,并在 Village getPopulation() 方法中返回总和。我不确定如何继续编写 getPopulation() 方法。基本上,我想遍历建筑物数组并为实现住宅接口的每个建筑物调用 getPopulation 方法,但我不确定如何执行此操作。

enter image description here

我的课程是:

住宅:

interface Dwelling {
  int getNumberOfOccupants();
}

房子:

import javafx.scene.canvas.GraphicsContext;
import java.util.Scanner;

public class House extends Building implements Dwelling  {
    private final int occupants;
    private final int bedrooms;

    private House(String name,double xPosition,int bedrooms,int occupants){
        super(name,xPosition);
        this.bedrooms = bedrooms;
        this.occupants = occupants;
    }

    public static House create() {
        Scanner scan = new Scanner(system.in);
        House a;
        System.out.println("Enter name of the House: ");
        String name = scan.nextLine();
        System.out.println("Enter XPosition of the House: ");
        int xPosition = scan.nextInt();
        System.out.println("Enter number of bedrooms: ");
        int bedrooms = scan.nextInt();
        System.out.println("Enter number of occupants: ");
        int occupants = scan.nextInt();

        a = new House(name,xPosition,bedrooms,occupants);
        return a;
    }

    public void draw(GraphicsContext canvas){
    }

    @Override
    public String toString(){
        return "House: " + "bedrooms= " + bedrooms + " occupants= " + occupants + "\n" + super.toString();
    }

    @Override
    public int getNumberOfOccupants() {
        return occupants;
    }
}

公寓楼:

import javafx.scene.canvas.GraphicsContext;
import java.util.Scanner;

public class ApartmentBuilding extends HighRise implements Dwelling{

    private int occupants;
    private final int occupantsPerFloor;

    private ApartmentBuilding(String name,int numberOfFloors,int occupantsPerFloor){
        super(name,numberOfFloors);
        this.occupantsPerFloor = occupantsPerFloor;
    }

    public static ApartmentBuilding create() {
        Scanner scan = new Scanner(system.in);
        ApartmentBuilding a;
        System.out.println("Enter name of the Apartment Building: ");
        String name = scan.nextLine();
        System.out.println("Enter XPosition of the Apartment Building: ");
        int xPosition = scan.nextInt();
        System.out.println("Enter number of floors: ");
        int numberOfFloors = scan.nextInt();
        System.out.println("Enter number of occupants per floor: ");
        int occupantsPerFloor = scan.nextInt();

        a = new ApartmentBuilding(name,numberOfFloors,occupantsPerFloor);
        return a;
    }

    public void draw(GraphicsContext canvas){
    }

    @Override
    public String toString(){
        return "Apartment Building: " + "occupantsPerFloor= " + occupantsPerFloor + "\n" + super.toString() + "\n";
    }

    @Override
    public int getNumberOfOccupants() {
        occupants = numberOfFloors * occupantsPerFloor;
        return occupants;
    }
}

建筑:

import javafx.scene.canvas.GraphicsContext;

public class Building implements Drawable {
    private final String name;
   private final double xPosition;
    
    public Building(String name,double xPosition){
            this.name = name;
            this.xPosition = xPosition;
    }

    public String getName(){
        return name;
    }

    public void draw(GraphicsContext canvas) {
    }

    public double getXPosition() {
        return xPosition;
    }

    @Override
    public String toString(){
            return "Type... Building:  " + "name= " + getName() + ",xPosition= " + getXPosition() + "\n";}
    }

村庄:

import javafx.scene.canvas.GraphicsContext;
import java.util.Scanner;

public class Village{
    public static final double Y_FLOOR = 300;
    private int size;
    private final String villageName;
    private final Building[] buildings;

    private Village(String villageName,int size){
        this.size = size;
        this.villageName = villageName;
        this.buildings = new Building[size];
    }

    public static Village create() {
        Village a;
        Scanner scan = new Scanner(system.in);
        System.out.println("Enter name of village: ");
        String villageName = scan.nextLine();
        int num = 0;
        do {
            System.out.println("Enter number of buildings: ");
            num = scan.nextInt();
            if (num <= 0)
                System.out.println("Input error,cannot enter a negative or zero");
        } while (num <=0);
        a = new Village(villageName,num);
        for(int i = 0; i < num; i++) {
            System.out.println("Enter type of Building: 1= House,2= Apartment,3= Store ");
            int choice = scan.nextInt();
            if (choice == 1){
                a.buildings[i] = House.create();
            }
            if (choice == 2){
                a.buildings[i] = ApartmentBuilding.create();
            }
            if (choice ==3){
                a.buildings[i] = Store.create();
            }
            else {
                System.out.println("Please enter a number between 1 and 3");
            }
        }
        return a;
    }

    public int getPopulation(){    
        return size;
    }

    public void draw(GraphicsContext canvas){
    }

    public String toString(){
        String str = "\n"+ "Village of " + villageName + "\n\n";
        for (int i=0; i<buildings.length; i++) {
            str = str + buildings[i].toString() + "\n"; // this adds each buildings information to the string
        }
        return str;
    }
}

解决方法

从迭代建筑物开始。假设 <LineChart width={600} height={200} data={chartData}> <Line type="monotone" dataKey="temp" stroke="#fc7f03" name="Temperature" unit=" °C"/> <CartesianGrid stroke="#ccc" strokeDasharray="5 5" /> <XAxis dataKey="date" tick={{fontSize: 10,fill: 'orange'}} tickFormatter={(unixTime) => moment(unixTime).format('DD.MM - HHч.')}/> <YAxis /> <Tooltip /> </LineChart> 可以是 BuildingDwelling,我们将不得不检查 Store 是否是 Building,然后进行安全转换并使用DwellingDwelling 方法,并在我们继续时将它们添加到我们的总数中。

注意:此转换是安全的,因为我们在执行之前检查了 building 是否为 getNumberOfOccupants

Village.java

Dwelling