2009-10-25 5 views
1

나는 양수 n을 매개 변수로 사용하고 원래 목록의 각 숫자가 n 번 반복되는 목록을 시작으로 새로운 ListItem을 반환하는 반복적 인 방법 스트레치를 작성한다고 가정합니다. 예를 들어, 원래 목록이 (6 7 6 9)이고 매개 변수 값이 2이면 반환되는 새 목록은 (6 6 7 7 6 6 9 9)입니다.간단한 자바 목록 질문

가 이미 해당 노드의 값과 다음에 대한 참조를 가진을 listitem 생성자가 :

ListItem(int number, ListItem next) { 
     this.number = number; 
     this.next = next; 
} 

내 코드는 다음과 같습니다

public ListItem stretch(int n) { 
     //make an array of list items that is n times bigger than the original one. 
     ListItem[] newList = new ListItem[this.length() * n]; 

    //Then loop through the old list one value at a time. At each value do a second loop n times to stretch 

     int index = 0; 
     int counter = 0; 
     for(int i = 0; i < this.length(); i++){ 
      while(counter++ < n){ 
       newList[index++] = this[i];************************* 
     } 
     return newList;**************** 
    } 

} 

이 개 문제의 포인트가 있습니다, 나는 그 줄에 별표를 붙였다. 나는 listitem을 리턴해야하는데, NewList는 배열이다. 첫 번째 별표 표시 줄에 어떤 문제가 있는지 잘 모르겠습니다.

도움이되거나 도움이 될만한 정보가 있습니다.

+0

어떤 종류입니까? 왜 당신이 그것을 서브 스크립팅하는지 확실하지 않습니다. –

+1

San Jacinto가 의미하는 것은 이것 [i]; 부분은 거의 틀림없이 틀리다. – theycallmemorty

답변

2

숙제?

당신이 연결된 목록을 작성하는 것으로 보이지만 대신에 ListItem 배열을 만드는 것처럼 보입니다. ListItems의 배열이 이 아닌이 아니지만 각 ListItem의 다음에 값이 목록의 다음 항목을 가리 키도록해야합니다.

그러면 함수의 마지막 줄이 목록의 첫 번째 항목을 반환합니다.

+0

죄송합니다, 저는 자바에있어 초보자입니다. 조금 더 자세히 설명해 주시겠습니까? 나는 내가 배울 수 없기 때문에 당신이 코드를 작성하는 것을 원하지 않지만, 주제에 대한 더 자세한 내용이 도움이 될 수있다. 감사. – Jeff

+0

ListItem이 먼저 있고 ListItem이 두 번째라면 first.next = second와 같은 작업을 수행해야합니다. 첫 번째 ListItem에 후속 항목에 대해 '알기'. – theycallmemorty

0

첫 번째 별표 표시 줄은 가장 확실하게 잘못되었지만 생각해 보면 문제가되지 않습니다. 처음에는 배열을 반환하라는 요청을받지 않았습니다.

ListItem을 반환하는 방법에 대한 문제점은 입력 내용이 실제로 보이는지 고려하면 문제를 해결할 수 있습니다. 용지 한 장을 가져 와서 그립니다. 그러면 단일 목록 항목 만 반환하면 충분하다는 것을 알 수 있습니다. 각 항목을 두 배로 늘리려면 ListItem에서 무엇을해야합니까?

0

첫 번째 줄의 문제점은 this이 (가) 배열이 아니기 때문에, 그 배열을 첨자화할 수 없다는 것입니다 ([i]). ListItem 클래스에 대한 세부 정보가 없으면이 문제를 해결할 수 없습니다. 연결된 목록을 만들고 있습니까?

반환을 위해서는 배열의 첫 번째 항목을 반환하고 싶을 것입니다. 그렇다면 return newList[0]으로 변경하십시오. 배열을 반환하려면 다음과 같이 배열을 반환하도록 함수를 변경하십시오. public ListItem[] stretch(.

3

이 문제에 접근하는 가장 좋은 방법은 그림을 그리는 것입니다. 그런 다음 문제를 하위 문제로 분해하십시오. 의이 간단한 경우부터 시작하자 : 길이 2의 목록 : 그것의

 
+---+ +---+ The "/" here is the "null" above, which terminates the list. 
| 1 |->| 2 |-/ 
+---+ +---+  

생각해이 방법 :

ListItem two = new ListItem(1, ListItem(2, null)); 

여기 한 장의 사진 여기

two = (number == 1 
     (next == (number == 2 
        (next == null 

는 다른 사진의 목록으로 구성 "다음"을 통해 나머지 목록을 가리키는 첫 번째 ListItem 중 하나입니다. 빈 목록은 null이며 마지막 ListItem의 "next"는 항상 비어 있습니다. (없는).

이제 목록을 "스트레칭"하라는 메시지가 표시 될 때 실제로 진행되는 작업은 무엇입니까? 2 시까 지?

음, 빈 목록은 쉽고 변경되지 않습니다. 그러나 null.stretch()이 사용중인 언어로 잘못 처리 될 것이므로 관련성이 없습니다.

우리가 가진 : 길이 1의 목록은 우리의 간단한 실제 경우입니다

 
we have  we want 

+---+   +---+ +---+ 
| 1 |-/  | 1 |-->| 1 |-/ 
+----   +---+ +---+ 

좋아, 그건 그렇게 어렵지 않다. 이미 길이가 1 인 목록이 있습니다. 우리가해야 할 일은 새로운 ListItem의 다음 단계에서 중단해야하고 우리는 길이가 2 인 목록을 가질 것입니다. 분명히 우리는 기존 목록에 무언가를 추가 할 수있는 능력이 필요합니다. 전면에 추가하는 것은 가장 쉬운 방법입니다, 그래서 우리는 그것에 대해 약간의 도우미 정의 할 수 있습니다 :

ListItem addItemToFront(int number) { 
    return new ListItem(number, this); 
} 

가 지금 좋아하는 업 코드의를하자 전화가 stretchFirstItemByOne :

ListItem stretchFirstItemByOne() {   
    return this.addItemToFront(this.number); 
} 

당신은 정액을 이 예제에서 this.something()을 많이 사용하는 것을 보자. 이것은 필요하지 않지만 이다. 난 그냥 이들이 현재 개체 (this)에 대한 메소드 호출임을 분명히하려는 것이다.

그러나 우리가 좀 더 크게 늘리고 싶다고 가정하면 n? 위의 for 루프를 사용하기 위해 이미 다소 불행하게도 시도했다. 너 그렇게 할 수있어. 그러나 나는 그것을 다르게 할 것입니다.

ListItem stretchFirstItem(n) { 
    if (n == 1)  // stretching to length 1 means nothing 
     return this; // to do. just return this. 
    else { 
     // well, if we stretch our item to length n-1 first 
     // then all we have to do is stretch it by one and 
     // we're done. 
     return this.stretchFirstItem(n-1).stretchFirstItemByOne(); 
    } 
} 

그 중 하나를 중지하고 생각해보십시오. 문제가있는 경우 for 루프로 다시 작성하십시오.

매우 훌륭합니다.하지만 길이가 1 인 목록 만 처리합니다. 진실한, 진실한.

당신은 길이 3의 목록이 있다고 가정하면

 
    +---+ +---+ +---+ 
(| 1 |->| 2 |->| 3 |-/).stretch(2) 
    +---+ +---+ +---+ 

거친 2하여 스트레칭 싶어? 최소한 우리는 시작할 수 있습니다.

ListItem stretch(int n) { 
    ListItem restOfList = this.next; 
    if (restOfList == null) { // this list has length one 
     return this.stretchFirstItem(n); 
    } else { 
     // if we had the rest of the list stretched, then we could 
     // add this.number to the front of this stretched list, stretch 
     // that first item and then we'd be done. 
    } 
} 

야,하지만 우리를 위해 그렇게하기로 스트레치, 당신이 모르는입니다 전체 목록을 스트레칭 : 우리는 목록에 하나의 항목 만있는 경우 일을 처리하는 방법을 알아? 나머지 목록을 늘리는 데 사용할 수 없으므로 첫 번째 항목을 쉽게 늘리고 늘릴 수 있습니까? 그러나 우리는 아직 스트레칭을 끝내지도 못했습니다. 그건 의미가 있습니다. 작동하지 않습니다. 그렇게 쉬울 수는 없습니다. 그럴 수 있니?

ListItem stretch(int n) { 
    ListItem restOfList = this.next; 
    if (restOfList == null) { // this list has length one 
     return this.stretchFirstItem(n); 
    } else { 
     return restOfList  //------------------------- 
      .magic(...)  // Left as an exercise for 
      .moreMagic(...) // the reader. 
      .zyzzy(...);  //------------------------- 
    } 
}