【问题标题】:Call method from Object within Object?(Java)从对象中的对象调用方法?(Java)
【发布时间】:2016-10-11 07:53:55
【问题描述】:

我尝试搜索和阅读槽(类似的声音)问题,但我似乎找不到解决方案。

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

无论如何,为了让这个有用,我需要首先创建我的房子的对象,其中包含所有楼层,包含所有房间,包含所有演员(灯等)。

这些是所有这些对象的 sn-ps,从上到下,因为它们应该相互堆叠(代码尚未完成也未优化,我知道我可以对所有 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;
    }
}

我现在在我的 Mainclass 中尝试做的是创建一个带有地板、房间和一些演员的新建筑。代码如下:

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 还不是很喜欢,而且可能缺少一个明显的部分。

【问题讨论】:

标签: java object arraylist methods


【解决方案1】:

要回答您的问题,将新房间添加到建筑物楼层的最简单方法是:

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);

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

【讨论】:

  • 谢谢,这行得通。感谢您的格式提示,会做的。我现在还没有 getFloor 方法的唯一原因是因为我还没有完成,我一直在制作原型(这就是为什么 main 方法中的代码看起来像现在这样,它只是为了快速测试)。当我进一步前进时,我会报告! :)
  • 太棒了!很高兴我能帮忙:D
【解决方案2】:

在您的 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。否则为变量创建 getter/setter 并实例化一个新的构建对象。而且按照惯例,变量名以小写开头,即在本例中为Building building = new Building(),您首先看到的内容就像您访问一个实际上不是静态的静态变量。

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

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

【讨论】:

  • 谢谢,我会试试的。 (goddamit enter 会自动发布我的答案!)我确实将 Building、Floor 等作为单独的类。他们只是不互相扩展。那会需要吗?我正在做的基本上是一个文本输入,比如“打开厨房里的壁灯”,它过滤除“壁灯”“厨房”“打开”之外的所有内容,然后他在“中查找“壁灯”的地址厨房”,并发送一个 TCP 数据包打开灯。
  • 需要吗?不,您可以按照自己的方式进行操作。我的内心后勤只是忍不住提出了这个建议。如果这是您计划维护(代码明智)的东西,则子类化可以清理它。但如果你只是把它放在一起,然后想在它发生后忘记它,那么可能没关系。
  • 我明白了。所以我想在性能方面它不会有所作为?这是我最大的担忧。不,我确实打算让这个项目成为一个持续的项目。
  • 不,我认为性能不会受到明显影响。但是,如果这是一个正在进行的项目,那么自我记录/可维护的代码将是要走的路。编辑:不过,这只是我的看法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 2014-08-17
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
  • 2016-07-31
相关资源
最近更新 更多