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
반응형
'개발관련 > 오류노트' 카테고리의 다른 글
예외를 올바르게 무시하는 방법 (0) | 2021.06.14 |
---|---|
예외 생성에 대한 지침이나 모범 사례 (0) | 2021.06.13 |
컬렉션을 반복하여 루프에서 개체를 제거 할 때 ConcurrentModificationException 방지 (0) | 2021.06.09 |
null 매개 변수에 대한 IllegalArgumentException 또는 NullPointerException? (0) | 2021.06.08 |
Angular 오류 "EXCEPTION: Can't resolve all parameters for component" (0) | 2021.06.07 |