从Object中的Object调用方法?(Java)



我试着搜索和阅读(听起来类似)问题,但似乎找不到解决方案。

我目前正在制作一个原型,用文本输入来控制一些灯。文本输入已经在工作,它可以正确地过滤输入,只挑选出相关的部分。

不管怎样,现在我需要首先创建我的房子的对象,它包含所有楼层,包含所有房间,包含所有演员(灯等)。

这些是所有这些对象的片段,从上到下,因为它们应该堆叠在一起(代码还没有完成,也没有优化,我知道我可以对所有if-else语句使用switch case):

import java.util.ArrayList;
public class Building {
String Name;
ArrayList<floor> floor = new ArrayList<floor>();
public Building(String Name){
this.Name = Name;
}
public boolean checkFloor(String Name){
int count = floor.size();
boolean ret = false;
while(count < floor.size()){
if (floor.get(count).Name == Name){
count = floor.size();
ret = true;
}
count++;
}        
return(ret);
}
public void newFloor(String Name){
Name = Name.toLowerCase();
if (Name == "keller" || Name == "basement"){
floor basement = new floor("basement");
floor.add(basement);
}
else if (Name == "eg"){
floor ground = new floor("eg");
floor.add(ground);
}
else if (Name == "1og"){
floor first = new floor("first");
floor.add(first);
}
else if (Name == "2og"){
floor second = new floor("second");
floor.add(second);
}
else if (Name == "3og"){
floor third = new floor("third");
floor.add(third);
}    
}    
public void newRoom(String Floor, String Name){        
}
}

public class floor {
String Name;
ArrayList<room> room = new ArrayList<room>();
transcoder transcode = new transcoder();
public floor(String Name){
this.Name = Name;
}

public boolean checkRoom(String Name){
int count = room.size();
boolean ret = false;
while(count < room.size()){
if (room.get(count).Name == Name){
count = room.size();
ret = true;
}
count++;
}
return(ret);
}
public void newRoom(String mName){
String Name = transcode.getRoom(mName);
if( Name == "ground"){
room ground = new room("ground");
room.add(ground);
}
else if ( Name == "basement"){
room basement = new room("basement");
room.add(basement);
}
else if ( Name == "first"){
room first = new room("first");
room.add(first);
}
else if ( Name == "second"){
room second = new room("second");
room.add(second);
}      
}
}

public class room {
String Name;
ArrayList<Actor> Actors = new ArrayList<Actor>();
public room(String Name){
this.Name = Name;
}
public void addActor(String Name, int Type, String Address, int Channel, boolean Dim){
Actors.add(new Actor(Name, Type, Address, Channel, Dim));
}
public void removeActor(String Name){
int count = 0;
while (count <= Actors.size()){
if (Actors.get(count).Name == Name){
Actors.remove(count);
count = Actors.size();
}
count++;
}
}
public boolean containsActor(String Name){
int count = 0;
boolean ret = false;
while (count < Actors.size()){
if (Actors.get(count).Name == Name){
ret = true;
count = Actors.size();
}
count++;
}
return(ret);
}
public String getAddress(String Name){
int count = 0;
String ret = "leer";
while (count < Actors.size()){
if (Actors.get(count).Name == Name){
ret = Actors.get(count).Address;
count = Actors.size();
}
count++;
}
return(ret);
}
public int getType(String Name){
int count = 0;
int ret = 0;
while (count < Actors.size()){
if (Actors.get(count).Name == Name){
ret = Actors.get(count).Type;
count = Actors.size();
}
count++;
}
return(ret);
}
}

public class Actor {
String Name;
String Address;
int Channel;
int Type;
boolean Dim;
int On; //muss noch deklariert werden!
int Off;

public Actor(String Name, int Type, String Address, int Channel, boolean Dim){
this.Name = Name;
this.Type = Type;
this.Address = Address;
this.Channel = Channel;
this.Dim = Dim;
}
}

我现在在主课上想做的是创建一座新的大楼,里面有一层楼、一个房间和一些演员。代码如下:

System.out.println("Gebäudename eingeben(egal): ");
String Name = user_input.nextLine();
Building Building = new Building(Name);
System.out.println("Stockname eingeben(eg): ");
Name = user_input.nextLine();
Building.newFloor(Name);
System.out.println("Raumname eingeben(wohnen): ");
Name = user_input.nextLine();
Building.floor

现在在Building.floor的末尾,我不太明白如何在对象楼层中添加一个新房间。我很感激你的帮助,因为我对Java还不太感兴趣,可能遗漏了一个明显的部分。

要回答您的问题,在建筑物的地板上添加新房间的最简单方法是:

Building.floor.get(0).newRoom(Name);

floor是一个ArrayList,在第一个索引上调用get()将允许您随后调用newRoom()

让你的代码更可读/更容易理解的一些建议:

  • floor更改为Floor,将room更改为Room,以使类名大写。

  • ArrayList的名称从floor更改为floors

  • ArrayList的名称从room更改为rooms
  • 在主类中声明单独的String变量,用于存储用户输入
  • 在将对象添加到相应的ArrayList之前,请将其单独存储

我想说的最重要的一点是向Building类添加一个getFloor()方法。

像这样(假设您进行了上述更改):

public Floor getFloor(String floorName){
Floor correctFloor = null;
for(Floor floor : floors) {
if(floor.Name == floorName) {
correctFloor = floor;
}
}
return correctFloor;
}

然后你代替

System.out.println("Gebäudename eingeben(egal): ");
String Name = user_input.nextLine();
Building Building = new Building(Name);
System.out.println("Stockname eingeben(eg): ");
Name = user_input.nextLine();
Building.newFloor(Name);
System.out.println("Raumname eingeben(wohnen): ");
Name = user_input.nextLine();
Building.floor.get(0).newRoom(Name);

你可以放(再次假设上述变化)

System.out.println("Gebäudename eingeben(egal): ");
String buildingName = user_input.nextLine();
Building building = new Building(buildingName);
System.out.println("Stockname eingeben(eg): ");
String floorName = user_input.nextLine();
Floor floor = new Floor(floorName);
building.newFloor(floorName);
System.out.println("Raumname eingeben(wohnen): ");
String roomName = user_input.nextLine();
building.getFloor(floorName).newRoom(roomName);

这些只是建议,你有很多方法可以做到~祝你好运!

在Building类中,使用getter和setter。您有一个floor变量,但无法获得它。将此getter方法添加到Building

public ArrayList<floor> getFloors(){
return floor;
}

然后,你可以说类似的话,而不是说Building.floor

int floorToGet = (what ever floor in the ArrayList you want);
Building.getFloors.get(floorToGet).newRoom("New Room Name");

此外,如果我对你的编码风格提出一些建议,也有一些建议。按照惯例,所有类都以大写字母开头,即Building,而不是building,您可以在某些类中这样做,但在其他类中不这样做。此外,如果您想要使用类似Building.floor的语法,最好将该变量设置为static。否则,为变量创建getters/ssetter,并实例化一个新的构建对象。按照惯例,变量名以小写开始,即在本例中为Building building = new Building(),您最初所拥有的内容看起来像是访问一个实际上不是静态的静态变量。

最后一个建议,如果你熟悉这个概念。如果您将某些类进行子类化,可能会使数据访问更加容易。我的意思是,建筑物包含楼层,楼层包含房间。因此,如果不混淆的话,Building将是您的主类,然后是Floors extends BuildingRoom extends Floor

从逻辑角度来看,我认为这更有意义。但希望这能有所帮助。