2016-09-10 3 views
2

교수님은 정렬 된 int 배열을 만들고이 문자열을 문자열이있는 정렬 된 배열 목록으로 변환하기를 원합니다. 이것은 유지 보수에 관한 과제이며 원래 코드를 반영해야합니다. 그래서, 나는 크기 메소드, Collections.sort(), 또는 원래 코드를 반영하지 않는 것을 사용할 수 없다.정렬 된 int 배열을 정렬 된 배열 목록으로 변환하는 데 문제가 있습니다.

은 우리가

OrderedIntList() { 
    a = new int[10]; 
} 

    public void insert(int v) { 
    if(c == 0) { 
     a[0]= v; 
     c++; 
    } else { 
     int j = 0; 
     for (int i = 0; i < c; i++, j++) { 
      if(v < a[i]) 
       break; 
     } 
     for (int i = c; i > j; i--) { 
      a[i] = a[i - 1]; 
     } 

     a[j]= v; 
     c++; 
    } 
} 

를 부여 이것은 내가 배열 목록

 stringList() { 
    list = new ArrayList<String>(10); 
} 

    public void insert(String element) { 
    if(c == 0) { 
     list.add(0, element); 
     c++; 
    } else { 
     int j = 0; 
     for (int i = 0; i < c; i++, j++) { 
      if(element.compareTo(list.get(i)) == -1) 
       break; 
     } 
     for (int i = c; i > j; i--) { 
      list.set(i, list.get(0)); 
     } 

     list.set(j, element); 
     c++; 
    } 
} 

그것은

list.set(i, list.get(0)); 

에 예외를 던지는 유지로 변환하기 위해 함께 온 것입니다 디버깅 ArrayList.class는 인덱스가 크기와 같기 때문에 예외가 발생하는 것을 볼 수 있습니다. 나는 해결책을 생각해 낼 수 없다. 어떤 도움이라도 대단히 감사하겠습니다. 문제에 대한

+3

짧은 대답 :'add' 메서드를 사용하여 목록의 크기를 늘려야합니다. 아직 삽입하지 않은 요소들에 대해서'set'을 호출하는 것만으로는 그것을 할 수 없습니다. –

+1

@David Wallace가 말했듯이, set이 이것을 허용했다하더라도, 당신의 라인 list.set (i, list.get (0)); a [i] = a [i - 1]과 같지 않다면 a [i] = a [0]와 같은 일을합니다. 그래서 두 가지 버그가 있습니다. 나는 또한 당신이 어떤 list = new ArrayList를 잘못 해석하고 있다고 생각하고있다. (10); 이 경우에는 10 개의 문자열 목록을 만들지 않고 10 번째 숫자를 "힌트"로 사용하여 초기 용량 (크기가 아님)을 1 –

+0

@ben으로 설정합니다. "힌트"가 아닙니다. 실제 크기입니다. [javadoc] (https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html#ArrayList-int-)에 따라 : *** 지정된 초기 값으로 빈 목록을 구성합니다. 용량 *** – Bohemian

답변

1

하나 개의 솔루션 만이 10 문자열 목록을 달성 할 수 있기 때문에

stringList() { 
    list = new ArrayList<String>(10); 
    for(int i = 0; i < 10; i++){ 
     list.add(""); 
    } 
} 

할 대신

stringList() { 
    list = new ArrayList<String>(10); 
} 

이며, 첫 번째는 보유 할 능력을 가지고 목록을 만든다 10 문자열 (성능 힌트가 더 많음)

+0

@ 보헤미안, 데이터 구조를 처음 채울 필요가 없습니다. 그러나 내가 제안한 변화는 옳다. 필자는 데이터 구조를 미리 채우지 않고 insert()를 사용하는 대신 목록의 꼬리에 요소를 추가하는 대체 접근법을 제안한다는 것을 의미한다고 생각합니다. 이것은 삽입 정렬이기 때문에 효과가 있습니다. 그러나 제안한 것은 작동해야합니다. –

3

이 할당의 흥미로운 점은 배열과 목록의 동작에 중요한 차이가 있다는 것입니다. 배열의 고정 크기는 wh입니다 항목이 추가되면 목록이 확장됩니다. 목록의 경우 끝 이외의 항목을 추가하는 것은 삽입이고 항목을 자동으로 오른쪽으로 이동하여 여유 공간을 만듭니다. 그것은 배열에서 발생하지 않으므로 리팩터링하는 코드에서 수동으로 수행해야합니다.

따라서, 배열에 대한 목록의 정확한 최소 리팩터링은 setinsert으로 바꾸고 요소를 이동하는 데 필요한 코드를 제거하는 것입니다. 더 이상 목록은 필요하지 않습니다 것 : 빈 목록에 추가

목록에 대한
public void insert(String element) { 
    if (c == 0) { 
     list.add(element); 
     c++; 
    } else { 
     int j = 0; 
     for (int i = 0; i < c; i++, j++) { 
      if (element.compareTo(list.get(i)) < 0) 
       break; 
     } 
     list.insert(j, element); 
     c++; 
    } 
} 

는, 특별히 빈 목록을 처리하는 것은 완전히 불필요 그래서 위치 0에 삽입과 동일합니다. 그러나 그것은 '원본'코드를 반영하지 않을 수도 있습니다.

또 다른 미묘한 차이점은 10 개 이상의 항목을 삽입하면이 코드가 오류를 일으키지 않는다는 것입니다. 초기 코드의 동작을 정확하게 반영하려면 특별히 테스트를 추가해야합니다.

if (c == MAX_SIZE) 
    throw new ArrayIndexOutOfBoundsException(c); 

그것은 당신의 임무는 당신이 조건을 처리 할 것으로 예상되지 않는다 가능성이 높습니다하지만이 포함되어 있지 않은 경우 리팩토링은 함수의 행동을 변화 것을 알고 가치가있다.

+0

@ 보헤미안이 대답은 어떻게 관련이 없습니까? 오히려, arraylist 모든 요소를 ​​개최 할 수있는 충분한 능력을 가지고 -하지만이 대답은 그 사실에도 불구하고 서있다. –

+0

@spinter 긴 주말 ... 당신 말이 맞아요! – Bohemian