2016-06-10 2 views
1

Ive는 검색 및 트로프 (비슷한 소리) 문제를 시도했지만 해결할 수없는 것 같습니다.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에서 꽤 지금 오브젝트 바닥에 새 방을 추가하는 방법을 참조 해달라고. 이드는 어떤 도움을 주셔서 감사합니다. 아직 자바에서는 그다지 환상적이지는 않지만, 분명히 분명한 부분이 빠져 있습니다.

+0

http://stackoverflow.com/help/how-to-ask http://stackoverflow.com/help/mcve –

답변

1

귀하의 질문에, 건물의 층에 새로운 공간을 추가하는 가장 간단한 방법 답변을 따라서이다 :

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

floor는 ArrayList를하고 첫 번째 인덱스에 get()를 호출하는 것은 당신에게 다음 수 newRoom()으로 전화하십시오.

제안은 당신의 코드가 더 읽기 쉽고/이해하기 쉽게 만들기 :

  • RoomFloorfloorroom을 변경하여 클래스 이름을 대문자로.

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

를 넣을 수 있습니다 이것들은 단지 제안 일뿐입니다. 당신이 할 수있는 많은 방법이 있습니다 ~ 행운을 빌어 요!

+1

고마워요. 서식 도움말 주셔서 감사합니다, 그들을 할 것입니다. 지금 당장 getFloor 메소드를 사용하지 않는 유일한 이유는 Im을 꽤 많이 수행했기 때문에 프로토 타입을 매번 (즉, main 메소드의 코드가 왜 보이는 지, 빠른 테스트를 위해서인지) 때문입니다. 악의적 인보고가 나올 때 다시 앞으로! :) – Redimo

+0

굉장! 다행히 도울 수있어. D – Danoram

1

건물 클래스에서 getter 및 setter를 사용하십시오. 변수가 floor 개이지만 가져올 방법이 없습니다. 대신 나는 당신의 코딩 스타일과도 몇 가지 조언에 대해 몇 가지 제안을한다면 당신이 뭔가 같은

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

또한 말할 수 Building.floor을 말하는에서 다음 Building

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

이 getter 메소드를 추가합니다. 규칙에 따라 모든 클래스는 대문자로 시작합니다. 즉, building과 반대로 Building으로 시작하는 클래스가 있지만 일부 클래스에서는 그렇지 않습니다. 또한 Building.floor과 같은 구문을 사용하려는 경우 해당 변수를 static으로 설정하는 것이 좋습니다. 그렇지 않으면 변수에 대한 getters/setter를 만들고 건물의 새 객체를 인스턴스화합니다. 그리고 관습에 따라 변수 이름은 소문자로 시작합니다 (이 경우 Building building = new Building()). 실제로 정적이 아닌 정적 변수에 액세스하는 것처럼 보입니다.

당신이이 개념을 잘 알고 있다면 마지막으로 한 가지 제안. 일부 클래스를 하위 클래스로 분류하면 데이터 액세스가 더 쉬워 질 수 있습니다. 그리고 제가 말하고자하는 것은 Buildings에는 Floors가 포함되고 Floors에는 Rooms가 포함된다는 것입니다. 따라서 혼란스럽지 않으면 Building이 기본 클래스가되며 Floors extends BuildingRoom extends Floor이됩니다.

논리적 인 관점에서 볼 때 나는 이것이 더 합리적이라고 생각합니다. 그러나 잘하면이 도움이됩니다.

+0

감사합니다. (내 대답을 자동으로 입력하십시오!) 건물, 층 등을 별도의 클래스로 사용하고 있습니다. 그들은 단지 서로를 연장하지 않습니다. 그게 필요할까요? 내가하고있는 일은 기본적으로 "wallamp"를 "켜기"와 같은 텍스트 입력으로 "wallamp" "kitchen" "on"을 제외한 모든 것을 필터링 한 다음 "wallamp"의 주소를 찾습니다. "kitchen"에 저장하고, TCP 패킷을 보내 램프를 켭니다. – Redimo

+0

필요하십니까? 아닙니다. 당신이하고있는 방식대로 할 수 있습니다. 제 내적 물류는 그저 도움을 줄 수는 없지만 그 제안을 할 수는 있습니다. 이것이 (코드 현명한) 유지 관리 계획을 세우면 서브 클래 싱을 통해 정리할 수 있습니다. 그러나 당신이 이것을 함께 던지고 나면 일단 잊어 버리고 싶다면 아마도 문제가되지 않을 것입니다. –

+0

나는 본다. 그래서 나는 성능이 현명하지 않다고 생각한다. 그게 가장 큰 관심사입니다. 그리고 나는 이것을 진행중인 프로젝트로 만들 계획을 세우지 않았습니다. – Redimo

관련 문제