2017-09-04 3 views
0

처리 중에 ArrayList의 초기 요소 수가 가변적이지만 (코드에서 변경하지 않음) Number와 Number를 변경하도록 IntList의 ArrayList를 만들려고합니다. IntList의 요소 중 초기 값은 0이지만 코드에서 추가되고 편집됩니다. 내 코드의 ArrayList를 각각의 사다리의 Y 위치에 대응 INT 구성 요소 "렁"을 함유하는 IntList를 있고, 래더 인 일본 래더 게임이다. "인쇄 (사다리);" IntList의 ArrayList에서 삽입 부분 수정

ArrayList <IntList> Ladders = new ArrayList <IntList>(); 
IntList temp = new IntList(); 

void setup() 
{ 
    for(int i=0;i<numRails-1;i++) 
    { 
    Ladders.add(new IntList()); 
    temp.clear(); 
    temp.append(0); 
    Ladders.set(i,temp); 
    } 
} 
void addRung (int spot) 
{ 
    temp.clear(); 
    temp = Ladders.get(spot); 
    temp.append(50); 
    //note that 50 is an arbitrary number, it would be given by MouseY 
    Ladders.set(spot,temp); 
    print(Ladders); 

    //I have also tried... 
    Ladders.get(spot).append(50); 
} 

그래서 내 문제는 addRung()는 모든 단일 ArrayList에 적힌 요소와 50를 추가하는 것이다 outputs ...

[IntList size=1 [ 50 ], IntList size=1 [ 50 ], IntList size=1 [ 50 ], IntList size=1 [ 50 ], IntList size=1 [ 50 ], IntList size=1 [ 50 ], IntList size=1 [ 50 ], IntList size=1 [ 50 ], IntList size=1 [ 50 ]] 

이 문제를 완전히 해결할 수있는 좋은 방법이 있습니까? 아니면 잘못된 것입니까?

나는 내 코드가 출력되는 것을의 이미지 ... It should be a single rung at location 50 but it is 9 rungs at 50.

+1

당신은 ArrayList를로 50 회를 추가 한 IntList를을 만들고 있습니다. 50 가지 IntLists가 필요합니다. –

+0

addRung() 함수를 작성하려면 어떻게해야합니까? –

답변

0

에 대해 신중하게 생각하세요 포함 정확히이 코드는하고있다 : 여기

for(int i=0;i<numRails-1;i++) 
    { 
    Ladders.add(new IntList()); 
    temp.clear(); 
    temp.append(0); 
    Ladders.set(i,temp); 
    } 

당신은 새로운 IntList에 추가하고 귀하의 LaddersArrayList 그런 다음 temp을 지우고 0을 추가 한 다음 방금 추가 한 IntList을 대체하는 temp으로 색인 (새로 추가 한 IntList을 추가 함)을 설정하고 있습니다.

즉, 당신은 ArrayList의 모든 인덱스에 temp를 추가하고 있습니다. 이는 동일한 IntList을 참조하는 것입니다. 따라서 하나의 인덱스에 값을 추가하면 모든 인덱스에 값이 추가됩니다.

는이 문제를 해결하려면, 당신은 완전히 temp 변수를 제거해야합니다. 다만 각 인덱스에 새 IntList을 추가 한 다음 ArrayList의 인덱스에서 IntList를 얻을 수있는 get() 기능을 사용합니다. 그 결과는 다음과 같습니다

ladders.get(index).append(value); 

측면 참고로, 당신이 정말로 debugging your code의 습관을해야을 질문을하기 전에. 몇 차례의 진술은 당신이 무슨 일이 일어나는지 알아낼 수 있도록 먼 길을 가졌을 것입니다. 그런 다음 연결이 끊어지면 연결이 끊긴 스 니펫 대신 MCVE을 게시 할 수 있습니다.

또한 표준 명명 규칙을 사용하려고한다 : 변수는 소문자로 시작해야한다.

+0

고마워, 케빈. 코딩에 익숙하지 않아 이것이 첫 번째 질문입니다. 다음 번에 더 많은 정보를 포함시켜야합니다. –

+0

@MaxwellGreene 문제가 없습니다. 도움이된다면 [답변 수락] (https://stackoverflow.com/help/someone-answers)을 할 수 있습니다. 행복한 코딩. –