2010-05-03 7 views
0

내가 작성한 질문에 의해 하나의리스트에서 배열로 요소를 복사했다는 것을 알아 냈다.이 메서드는 toArray()을 사용해야한다.리스트 데이터를 하나 더 요소로 채우기

그러나 목록이 n 인 것으로 가정 해 봅니다. n + 1 크기의 배열에 복사하고 첫 번째 위치에 다른 객체를 추가하고 다른 객체에는 n 위치 n 목록의 데이터를 배치합니다.

내가 지금 그것을하고있어 방법이지만, 더 좋은 방법이 있다면 난 그냥 궁금 해서요 그렇게 위해 :

Object array[] = new Object[list.size() + 1]; 

    Object chk = new Object(); 

    array[0] = chk; 

    for(int i = 1; i < array.length; i++){ 
     array[i] = list.get(i); 
    } 

답변

1

나는 당신이 달성하려고하는 것을 이해하지 못했지만, 내가 문제를 제대로 이해한다면, 이것은 내가 어떻게 할 것입니다 :

List<Object> elementList = new ArrayList<Object>(); 
    Object additionalElement = new Object(); 
    Object array[] = null; 

    //[Add code to populate the List] 

    //Add the additional element 
    elementList.add(0,additionalElement); 

    array = elementList.toArray(); 

이것은 반복하지 않는 장점 트릭을 할 것입니다 아무것도.

+0

하지만이 메서드를 추가하면 위치 0에있는 요소가 변경되지 않습니까? – marionmaiden

+2

이 접근법은 목록을 변경합니다. 위치 0에 새 요소를 추가하고 다른 모든 요소를 ​​한 위치 (위치 0에서 위치 1 등)만큼 이동합니다. –

+0

고마워요 @ 크리스티안. 이 추가 구현이 후속 값의 인덱스를 위축시킨 것을 나는 알지 못했다. – marionmaiden

0

것은 당신이 것을 방지 할 수있는 방법을 찾고 있다면 배열과 목록을 반복 할 때, 나는 너에게 운이 없다고 생각한다. 자바는 대량의 복사본을 만드는 방법을 제공하지 않는다. 단지 숨겨진 콜렉션을 통해 루핑을하는 API 호출을 사용하는 것을 제외하고는 보이지 않는다.

2

당신은 LinkedList를 사용하고 offerFirst()와 toArray()를 사용할 수 있습니다. 그러나 정말로 중요합니다.

+0

이 쿠폰은 어디에 있습니까? 첫 번째 방법은 무엇입니까? – marionmaiden

+0

'offerFirst (E)'는 Java 1.6의 새로운 기능입니다 (http://java.sun.com/javase/6/docs/api/java/util/LinkedList.html#offerFirst%28E%29). 리스트의 선두에 지정된 요소. 'addFirst (E)'와'add (0, E)'와 같은 효과가 있습니다. –

+1

offerFirst는 LinkedLists에서만 사용할 수 있습니다. 리스트 인터페이스의 다른 구현에는이 메소드가 없습니다. – marionmaiden

0

없이이 작업을 수행 할 수있는 유일한 방법 루프는 다음과 같습니다 성능 향상은 아마도에 의해 완화 될 수 있지만

Object array[] = new Object[list.size() + 1]; 
Object oldValues[] = list.toArray(); 

Object chk = new Object(); 
array[0] = chk; 
System.arrayCopy(oldValues, 0, array, 1, oldValues.length); 

System.arrayCopy가 조금 더 빠른 (너무 많이,하지만 빠른 그럼에도 불구하고) 루프보다 toArray, 목록의 구현에 따라 다릅니다.

전체적으로 List.get(int)이 허용되는 한 괜찮은 접근 방식입니다. (이 O (n이)라면 프랭크의 솔루션은 N O (때, 당신은) 차선 당신의 작업에 대한) (O와 N^2을 끝낼 수 있습니다.)

+0

그게 유일한 방법은 아닙니다. 위의 내용을 참조하십시오. – Chepech

2

는 반복자 사용

... 

int i = 1; 
for(Object item:list){ 
    array[i] = item; 
    i++; 
} 
+1

+1 : 반복은'LinkedList'와 같은 몇몇 종류의 목록에 대한'get (i)'해결책보다 효율적입니다. 그리고이 해결책은 여기에 주어진 다른 답변과 달리 목록을 변경하지 않습니다. –

관련 문제