IT TIP

ArrayList를 새 크기로 축소

itqueen 2020. 12. 3. 21:31
반응형

ArrayList를 새 크기로 축소


정말 직접 구현해야합니까?

private void shrinkListTo(ArrayList<Result> list, int newSize) {
  for (int i = list.size() - 1; i >= newSize; --i)
  list.remove(i);
}

크리에이트 하위 목록 제거하고 통화 할 요소의 범위와 clear반환 된 목록을.

list.subList(23, 45).clear()

이 접근 방식은 ListArrayList 문서에서 관용구로 언급됩니다 .


여기에 완전한 단위 테스트 코드 예제가 있습니다!

// limit yourHappyList to ten items
int k = yourHappyList.size();
if ( k > 10 )
    yourHappyList.subList(10, k).clear();
    // sic k, not k-1

또는 subList 메서드를 사용할 수 있습니다 .

public static <T> List<T> shrinkTo(List<T> list, int newSize) {
    return list.subList(0, newSize - 1);
}

사용 ArrayList를 # 인 removeRange () 메소드를 :

protected void removeRange (int fromIndex, int toIndex)

이 목록에서 색인이 fromIndex (포함)와 toIndex (배타) 사이에있는 모든 요소를 ​​제거합니다. 후속 요소를 왼쪽으로 이동합니다 (인덱스 감소). 이 호출은 (toIndex-fromIndex) 요소로 목록을 줄입니다. (toIndex == fromIndex 인 경우이 작업은 효과가 없습니다.)

그런 다음 ArrayList # trimToSize () 메서드를 사용하십시오.

목록의 현재 크기가되도록이 ArrayList 인스턴스의 용량을 자릅니다. 응용 프로그램은이 작업을 사용하여 ArrayList 인스턴스의 저장소를 최소화 할 수 있습니다.


내 솔루션 :

public static void shrinkTo(List list, int newSize) {
    int size = list.size();
    if (newSize >= size) return;
    for (int i = newSize; i < size; i++) {
        list.remove(list.size() - 1);
    }
}

그냥 사용하십시오 :

shrinkTo(yourList, 6);

또 다른 고려 사항이 있습니다. ArrayListin 메서드 시그니처 를 사용하는 것을 피하고 대신 List인터페이스로 작업 하여 ArrayList구현에 연결하여 예를 들어 a LinkedList가 요구 사항에 더 적합하다고 판단되면 라인 아래로 변경하기 어렵게 할 수 있습니다. . 이러한 긴밀한 결합을 방지하려면 비용이 듭니다.

대체 접근 방식은 다음과 같습니다.

private void shrinkListTo(List<Result> list, int newSize) {
  list.retainAll(list.subList(0, newSize);
}

불행하게도, List.retainAll()서브 클래스가 구현을 위해 당신이 필요하므로 방법은 선택 사항입니다 후 다른 일을한다.catchUnsupportedOperationException,

private void shrinkListTo(List<Result> list, int newSize) {
  try {
    list.retainAll(list.subList(0, newSize);
  } catch (UnspportedOperationException e) {
     //perhaps log that your using your catch block's version.
     for (int i = list.size() - 1; i >= newSize; --i)
        list.remove(i);
     }
  }
}

That is not as straight forward as your orginal. If you are not tied to the instance of the List that you are passing in, you could just as easily return a new instance by calling subList(int start, int end), and you wouldnt even need to make a method. This would also be a faster implementation, as (in Java 6), you would be getting an instance of an AbstractList.SubList that contains your list, an offset into it and a size. There would be no need for iterating.

If you are interested in the arguments for coding to Interfaces instead of classes, see this favorite article by Allen Holub

참고URL : https://stackoverflow.com/questions/1184636/shrinking-an-arraylist-to-a-new-size

반응형