2013-07-04 4 views
0

지도를 사용하여이 시나리오에 가장 효율적이며 효과적인 방법을 찾으려고합니다. 그것은 배열이어야합니다. 이것을 설명하기 위해 모범을 보였습니다.일부 조건을 기반으로지도에서 배열을 반환하는 가장 빠르고 가장 빠른 방법

기본적으로 몇 가지 sandwhich id 및 sandwhich 세부 정보로 구성된지도가 있고 나는 단지 상추가있는 배열 만 배열에 있어야합니다.

배열의 문제점은 크기를 알아야한다는 것입니다.이 경우에는 양상치가있는 샌드위치가 몇 개인 지 알 수 없습니다. 배열 목록을 사용할 수는 있지만 배열로 변환해야합니다.이 방법은 비효율적 인 복사 방법입니다.

예 :

//Assume that this map is given 
Map<Integer, Sandwich> sandwiches = //some method gets all sandwiches 
Meal[] meal = new Meal[sandwiches.size()]; 
for(Map.Entry<Integer, Sandwich> e : sandwiches.entrySet()) 
{ 
    if(e.getValue().hasLettuce()) 
     meal = new Meal(e.getValue); 
} 
//mandatory: An array must be returned 
return meal; 
+0

나는'sandwiches.entrySet()'을 의미 할 것입니다 ... – Makoto

+1

'Map'은 언제 hasLettuce 필드를 가지고 있습니까? :) – Zong

+0

@ Zong Zheng Li 오늘부터 : 그것을 지적 해 주셔서 감사합니다. Makota도 감사합니다. 코드 조각을 편집했습니다. – Mercury

답변

4

ArrayList를 사용합니다. Meal이 얼마나 필요한지 모를 경우 복사본을 만드는 것을 피할 수있는 방법이 없습니다. 복사본의 상각 된 비용은 저렴하며, 배열은 배열보다 문제에 더 잘 개념적으로 적합합니다. 정말로 원하는 경우 list.toArray(new Meal[0])으로 전화하여 배열을 얻을 수 있습니다.

+1

배열의 크기는 맵의 크기에 의해 제한되지만 배열을 축소하려면 끝에 한 번만 복사하면됩니다. 상각 된 버전은 기하학적 인 합계와 같이 초기에 정확히 동일한 수의 복사본을 수행하지만, 하나의 큰 할당은 많은 작은 것보다 효율적입니다 (성능은 성능에 관심이 있으므로). 또한'ArrayList'에서 배열로의 변환은 아마도 다른 사본을 요구할 것입니다. – Zong

+0

cool, 나는 'new meal [0]'대신에 'new meal [list.size()]'라고 생각하고 있습니까? – Mercury

+0

'new meal [list.size()]'도 작동하지만, 실수로'new meal [sandwiches.size()]'라고 말하면서 배열에 왜 널 값이 들어 있는지 궁금합니다. 그것은 라인 어딘가에 있습니다. – user2357112

관련 문제