팀 프로젝트가 끝이 났다. 모든 정신을 프로젝트에 집중하다보니 한 달이라는 시간이 금방 지나갔다.
그동안 손을 놓아버린 알고리즘과 다시 친해지기 위해 오랜만에 문제 하나를 풀어보았다.
오늘 다루게 될 에러는 알고리즘을 풀면서 만난 UnsupportedOperationException이다.
Array를 List로 변환한 후 List 요소를 삭제하고 싶었는데, 이 과정에서 에러가 발생했다.
아래는 에러가 발생했던 코드이다.
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
List<String> compList = Arrays.asList(completion);
for (String s : participant) {
if (compList.contains(s)) {
compList.remove(s); // 여기서 예외 발생
} else {
answer = s;
}
}
return answer;
}
}
Exception in thread "main" java.lang.UnsupportedOperationException: remove
at java.base/java.util.Iterator.remove(Iterator.java:102)
at java.base/java.util.AbstractCollection.remove(AbstractCollection.java:299)
at pgr42576.Solution.solution(Main.java:25)
at pgr42576.Main.main(Main.java:13)
원인
UnsupportedOperationException은 지원되지 않는 요청이 들어왔을 때 발생하는 예외이다.
예를 들어, 수정할 수 없는 List의 요소에 수정 또는 삭제를 시도했을 때 발생한다.
List, Queue, Set, Map과 같은 Collections에서 많이 발생한다.
일반적으로 가장 많이 발생하는 원인은 asList() 메서드를 사용했을 때라고 한다.(나의 에러 발생 원인도 해당 이유때문이다.)
asList() 메서드를 사용하면 고정된 크기의 List가 생성되고, 수정할 수 없기 때문에 add()와 remove()를 사용할 수 없다.
나도 asList()로 생성된 List에서 요소를 삭제하려고 했기 때문에 UnsupportedOperationException이 발생했던 것이다.
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
List<String> compList = Arrays.asList(completion); // 원인
for (String s : participant) {
if (compList.contains(s)) {
compList.remove(s); // 여기서 예외 발생
} else {
answer = s;
}
}
return answer;
}
}
해결 방법
아주 간단한다. asList()메서드로 생성된 수정 불가능한 List를 새로 생성한 List로 한 번 감싸면 수정 가능한 List로 반환된다.
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
List<String> list = Arrays.asList(completion); // 수정 불가능한 List
List<String> compList = new ArrayList<>(list); // 새로운 List에 전달하면 수정가능한 List로 반환된다.
for (String s : participant) {
if (compList.contains(s)) {
compList.remove(s);
} else {
answer = s;
}
}
return answer;
}
}
참조
https://rollbar.com/blog/fixing-unsupportedoperationexception-in-java/