2012-11-19 2 views
0

작동 코드 예제를 따로 골라서 작동 방식을 연구 할 수 있습니까? 특히, 내 목록에서 x 번호가 매겨진 개체의 주소 필드를 얻으려면 어떻게해야합니까? 목록에서 x 번째 개체를 어떻게 삭제합니까? 개체 x의 가격 필드를 새 값으로 설정하려면 어떻게해야합니까?arraylist에 저장된 객체에서 필드를 가져 오는 방법은 무엇입니까?

나는 특정 개체를 대상으로하고 조작하는 방법을 목록의 마지막에 추가 된 새로운 객체로 houseList.add이 장소 데이터를,하지만 난 그것의 반대를 이해하지 않고 방법을 이해 그것. 멀티 클래스 예제를 보여주십시오. 감사!

House 개체를 만드는 클래스이며 다음 정보를 보유합니다.

public House(int address, String street, double price, int rooms) { 
    this.address = address; 
    this.street = street; 
    this.price = price; 
    this.rooms = rooms; 
} 

하고 다음과 같은 방법이 있습니다 ...

public void SetAddress (int address){ 
    setAddress(address); 
} 

private void setAddress (int address){ 
    this.address = address; 
} 

public int GetAddress (int address){ 
    address = getAddress(address); 
    return address; 
} 

private int getAddress (int address){ 
    return address; 
} 

@Override 
public String toString() { 
    return address + " " + street + " " + price + " " + rooms; 
} 

... 다른 클래스에서

, 나는 houseList라는 이름의 하우스 개체의 목록을 선언하고이 ArrayList에가 있음 .

List<House> houseList; 
houseList = new ArrayList(); 

및 데이터로 채울 수,

houseList.add(new House(this.address, this.street, this.price, this.rooms)); 

과 반복 ...

public void showHouses() { 
    Iterator<House> itr = houseList.iterator(); 
    while (itr.hasNext()) { 
     System.out.println(itr.next().toString()); 
    } 
} 

이 시점까지, 내 ​​집의 방법 중 어느 것도 나열 이상으로 올로 오버라이드 (override)되고있는 toString 메소드를 제외 해, 재생합니다. 제가 알아낼 수 없었던 것은 목록의 x 번째 요소에 대해 this.street 또는 this.price를 가져 오는 방법입니다. 나는 houseList.add (새 집 (this.address, this.street, this.price, this.rooms))와 함께 목록에 데이터를 넣을 수 있습니다.
그리고 반복을 통해 예상대로 데이터가 저장되는 것을 볼 수 있습니다. 나는이 세터들과 게터들을 가지고 있지만, 나는이 아이템들을 꺼내거나 넣는 데 익숙해 져야 할 방법을 이해하지 못하고있다. 내가 houseList.add를 사용했기 때문에, add의 반대는 얻을 것이지만, 그렇지 않다는 것을 알았다. 올바른 구문을 알아 냈습니다.

+0

getter는 계통 결함이 있습니다. getter는 인수를 취하지 않고 객체의 일부 값 (인수로 전달한 값이 아님)을 반환합니다. 명명 규칙을 존중하지 않는 사람과 똑같은 일을하는 두 명의 게터는 정말 나쁜 생각입니다. –

+0

동일한 작업을 수행하는 두 가지 방법 중 하나는 공개이고 다른 하나는 비공개입니다. 알다시피, 이것은 캡슐화이며 데이터에 직접 액세스하지 못하게하고, 코드를 통해 출입 또는 출입을 제어 할 수 있으며이를 따르는 것이 좋습니다. 내가 틀렸어? 그렇다면 설명하십시오. – Michael

+1

public 메서드를 사용하는 경우에는 private 메서드를 사용하여 동일한 작업을 수행 할 필요가 없습니다. private 메소드가 복잡한 public 메소드 구현의 한 부분이라면 이해할 수 있지만 private getter를 호출하는 public getter는별로 의미가 없습니다. –

답변

2

고정 게터 먼저

, 게터/세터 처리합니다. 다음 게터 :

private int getAddress (int address){ 
    return address; 
} 

는 다음과 같이 고정되어야한다 : 당신의 코드에서

private int getAddress() { 
    return address; 
} 

, 당신의 getAddress(int address) 방법의 int 매개 변수를 가지고 있으며, 직접 인수를 반환합니다. 그것은 심지어 주소 값을 저장하는 필드를 보지 않습니다.목록을 통해

순회

이를 다시 작성할 수 있습니다 :

public void showHouses() { 
    Iterator<House> itr = houseList.iterator(); 
    while (itr.hasNext()) { 
     System.out.println(itr.next().toString()); 
    } 
} 

를보다 컴팩트 한 방법으로, 자바 5 스타일 for 루프를 사용하여, 다음과 같이 :

public void showHouses() { 
    for (House house : houseList) { 
     System.out.println(house); 
     // or, say: System.out.println(house.getAddress()); 
    } 
} 

또는 이와 같이, 반복자를 실제로 사용하려는 경우 :

public void showHouses() { 
    Iterator<House> itr = houseList.iterator(); 
    while (itr.hasNext()) { 
     House house = itr.next(); 
     System.out.println(house); 
     // or, say: System.out.println(house.getAddress()); 
    } 
} 

위 예의 경우 일반적으로 next()을 반복 할 때마다 한 번만 호출해야합니다. 즉, 로컬 변수에 itr.next()을 할당하고 반복 당 두 번 이상 itr.next()을 호출하는 대신이를 사용합니다.

첫 번째 방법의 장점은 짧다는 것입니다. 그리고 여러분이하고있는 모든 작업이 컬렉션을 반복하고 어떤 식 으로든 수정하지 않는다는 것을 알 수 있습니다 (여전히 값을 수정할 수는 있지만).

두 번째 방법의 장점은 itr.remove()을 호출하여 컬렉션을 트래버스 (반복) 할 때 컬렉션에서 요소를 제거 할 수 있다는 것입니다.

를 가지는가는 집

당신이 가지는가는 집이 필요하면, 당신은 쓸 수 있습니다 :

int x = ...; 
House h = houseList.get(x); 
System.out.println(h); 
// or: System.out.println(h.getAddress()); 

.

편집 :

for (Iterator<House> it = houseList.iterator(); it.hasNext();) { 
    House house = it.next(); 
    // Blah, blah.. 
} 

이 위의 반복자 기반 탐색과 같은 장점이 있습니다

여기 가끔 목록을 통과 코드에서 볼 또 하나 개의 패턴입니다. 그러나이 버전은 반복기 변수 (it)의 범위를 루프 본문으로 제한합니다. 위의 버전에서 iterator 변수의 범위는 전체 메소드 본문입니다. 따라서 반복문 밖에서 반복자를 사용하지 않는다는 것을 쉽게 알 수 있습니다.

범위를 루프 본문으로 제한하는 것은 메서드 (또는 다른 블록)에서 반복기 기반 탐색을 두 개 이상 수행하려는 경우에도 유용합니다. 또한 두 번째 루프가 두 번째 루프가 다른 유형의 컬렉션을 반복하는 경우에도 동일한 변수 이름을 다시 사용할 수 있습니다.

+0

고마워,이게 정말 어떻게 작동하는지 보는데 도움이된다. 이제는 왜 작동하는지 이해할 수 있습니다. 집 개체를 보유하기 위해 목록을 사용하고 있으며 집 개체를 반복 할 수 있습니다. House 개체가 생기면 개체에 포함 된 필드에 액세스 할 수 있으며 개체의 메서드를 호출하여 개체를 조작 할 수 있습니다. 그것은 구문을 배우고 당신을 위해 무엇을 할 수 있는지에 달려 있습니다. – Michael

4

itr.next() 다음 목록에서 House 개체를 반환합니다. 그 집 개체의 메서드를 호출해야합니다.

예 :

while (itr.hasNext()) { 

     House hs = itr.next(); 
     System.out.println(hs.getAddress(input)); 
     System.out.println(hs.toString()); 
    } 
+0

목록에서 # 3을 어떻게 타겟팅 할 수 있습니까? 필자는 이터레이터가 어떻게 내 목록을 통해 이동 하는지를 거의 이해하지 못하고 요소에 데이터가있는 한 0에서 끝으로 이동한다는 것을 알고 있습니다. 내 변수 이름을 사용해 주시겠습니까 ... hs == houseList입니까? 나는 어떻게 하우스 hs = itr.next() 이해가 안 돼요; 내 코드에서 나타납니다. 나는 집이나 무언가를 다시 선언해야합니까? hs가 House 객체라는 것뿐입니다. 나는 지금 그것을 얻은 것 같아 ... 내가 특정 하우스에 액세스해야 할 때마다 전체 목록을 반복해야한다는 것을 의미합니까? – Michael

+0

@Michael : hs는 HouseObject 참조입니다. houseList.add (....)를 사용하여 추가 한 객체는 반복 중에 hs에 다시 할당됩니다. – kosa

+0

@Michael : 다음 예제를 참조하십시오. http://www.java-samples.com/showtutorial.php?tutorialid=235 – kosa

관련 문제