개발관련/오류노트

자바 list에서 요소를 제거하려고 할 때 UnsupportedOperationException이 발생하는 이유

Rateye 2021. 6. 12. 18:14
728x90
반응형
질문 : 목록에서 요소를 제거하려고 할 때 UnsupportedOperationException이 발생하는 이유는 무엇입니까?

이 코드가 있습니다.

public static String SelectRandomFromTemplate(String template,int count) {
   String[] split = template.split("|");
   List<String> list=Arrays.asList(split);
   Random r = new Random();
   while( list.size() > count ) {
      list.remove(r.nextInt(list.size()));
   }
   return StringUtils.join(list, ", ");
}

나는 이것을 얻는다 :

06-03 15:05:29.614: ERROR/AndroidRuntime(7737): java.lang.UnsupportedOperationException
06-03 15:05:29.614: ERROR/AndroidRuntime(7737):     at java.util.AbstractList.remove(AbstractList.java:645)

이것이 올바른 방법일까요? 자바 .15

답변

코드에 대한 몇 가지 문제 :

API에서 :

Arrays.asList : 지정된 배열이 지원 하는 고정 크기 목록을 반환합니다.

add 할 수 없습니다. 당신은 그것에서 remove 할 수 없습니다. List 구조적으로 수정할 수 없습니다.

더 빠른 remove 를 지원하는 LinkedList 만듭니다.

List<String> list = new LinkedList<String>(Arrays.asList(split));

API에서 :

String.split(String regex) : 주어진 정규식 과 일치하는 부분을 중심으로이 문자열을 분할합니다.

| 정규식 메타 문자입니다. 리터럴로 분할하려면 | \| 이스케이프해야합니다. , Java 문자열 리터럴은 "\\|" .

template.split("\\|")

임의의 인덱스를 사용하여 한 번에 하나씩 remove 를 호출하는 대신 범위에서 충분한 난수를 생성 한 다음 적절한 인덱스에서 remove() 를 호출 listIterator() List 한 번 탐색하는 것이 좋습니다. 주어진 범위에서 무작위이지만 고유 한 숫자를 생성하는 방법에 대한 stackoverflow에 대한 질문이 있습니다.

이를 통해 알고리즘은 O(N) 입니다.

출처 : https://stackoverflow.com/questions/2965747/why-do-i-get-an-unsupportedoperationexception-when-trying-to-remove-an-element-f
728x90
반응형