2013-07-12 2 views
0

이제 ArrayDeque 지정된 요소에 문제가 있습니다.ArrayDeque의 요소 값 변경

Storages.add(new Storage("Furniture storage", 5, 58)); 

첫째로 저장 유형입니다. 다음 층은 1 층이고, 마지막 층은 doorNumber입니다.

이제 특정 ArrayDeque 요소 Floor을 다른 것으로 변경하고 싶습니다. 두 번째 목록 항목에서 예를 들어

Meat storage 1 18 

Meat storage 7 18  

에 저장 클래스가 내 메인 클래스

ArrayDeque<Storage> Storages = new ArrayDeque<Storage>(); 
Storage storage_obj = new Storage(); 

Storages.add(new Storage("Furniture storage", 5, 58)); 
Storages.add(new Storage("Meat storage", 1, 18)); 
Storages.add(new Storage("Hardware storage", 4, 41)); 
Storages.add(new Storage("Technique storage", 2, 27)); 
Storages.add(new Storage("Vegetable storage", 8, 88)); 

Storages[1] = storage_obj.setFloor(7); 

System.out.println("Whole storages list"); 
outputStorages(Storages); 

public class Storage { 
     private String type; 
     private int floor; 
     private int doorNumber; 


     public Storage(){ 
      this("------", 0,0); 
} 
    public Storage(String type_t, int floor_t, int doorNumber_t){ 
     type = type_t; 
     floor = floor_t; 
     doorNumber = doorNumber_t; 
    } 

    void setType(String type){ 
     this.type = type; 
    } 
    String getType(){ 
     return this.type; 
    } 

    void setFloor(int floor){ 
     this.floor = floor; 
    } 
    int getFloor(){ 
     return this.floor; 
    } 

    void setDoorNumber(int doorNumber){ 
     this.doorNumber = doorNumber; 
    } 
    int getDoorNumber(){ 
     return this.doorNumber; 
    } 
} 

P. 내 문법을 판단하지 말아라, 영어가 모국어가 아니다 ^^

+0

[]를 사용하여 ArrayDeque 요소에 액세스 할 수 없습니다. Iterator를 사용해야합니다. –

+0

@ johnchen902 무엇이 더 좋을까요? –

+0

@AlexeyOdintsov ok 나는 시도 할 것이다 –

답변

1

코드에 몇 가지 문제가 있습니다. 나는 그들을 단계적으로 언급하려고합니다 :

ArrayDeque<Storage> Storages = new ArrayDeque<Storage>(); 

1) 어떤 이유가 있나요 당신의 ArrayDeque를 사용하는 이유는 무엇입니까? 이중 종료 대기열 동작이 필요합니까? 또는 컬렉션이 필요합니까? 후자의 경우 ArrayList를 사용하는 것이 좋습니다.

2) naming convention for the Java programming language은 항상 변수의 소문자로 시작하도록 지정합니다.

3) 변수 선언 (및 매개 변수 및 메소드)에 인터페이스 유형 만 사용하면 어떤 인터페이스를 사용할 것인지 명확하게 알 수 있습니다.

내가 쓰는 것, 그것을 요약하면 :

Collection<Storage> storages = new ArrayList<Storage>(); 

다음 ...

Storages[1] = storage_obj.setFloor(7); 

을이 컴파일되지 않습니다. 스토리지 클래스는 다음과 같은 서명을 가진 setFloor 방법 선언

의미
void setFloor(int floor) 

, 당신의 방법 setFloor는 아무것도 반환하지 않습니다; 따라서 할당 할 수있는 것은 없습니다. 또한 Storages 변수는 배열이 아닙니다. 따라서 괄호 []을 사용하여 첫 번째 요소에 액세스 할 수 없습니다.

storages.get(0).setFloor(7); 

주, 이미 이름이 변경된 변수를 사용하는 것이 : 실제로 작동 무엇

, 당신은 컬렉션의 첫 번째 요소를 변경할 수있는 다음 코드를입니다.

기타 : 저장소 클래스는 매개 변수가없는 생성자를 선언하며 기본값을 설정합니다.또한 이러한 클래스의 사용자에게 적절한 값을 전달하도록하는 것이 좋습니다. 따라서 매개 변수가없는 생성자를 삭제하고 다른 인수를 남겨 두는 것이 좋습니다. 차례대로 들어오는 인수 (예 : null이 아닌 형식을 확인)에 대한 검사를 수행해야합니다.

+0

많은 정보. 새로운 자바에서, 한 번 ArrayDeque 그 ArrayList 더 나은 의견을 발견. 그러나 나는 모릅니다, 결코 봤지 왜. Java에서의 새로운 임 그래서 나는 모든 명령을 모른다. Btw 덕분에 당신이 내게 쓴 것을 요약하려고합니다. –

+1

예, 알고 있습니다. Java를 처음 접했을 때 많은 주제를 배우게됩니다. 단계별로 확인하십시오. 그럼에도 불구하고 처음부터 모범 사례를 사용하십시오. 기꺼이 도와 줘. – Seelenvirtuose

+0

그토록 많은 도움이되는 사람들이 있습니다. –

1

이렇게하면됩니다.

for (Iterator iter = Storages.iterator(); iter.hasNext();) { 
     Storage o = (Storage)iter.next(); 
     if (o.getFloor() == 1 && o.getDoorNumber() == 18) { 
      o.setFloor(7); 
     } 
     System.out.println(o); 
    } 

그러나 @ johnchen902 언급 ArrayDeuque 요소 랜덤 액세스에 적합한 수집하지 않습니다.