- 순회하면서 특정 요소를 검색하여 삭제하려는 경우 컬렉션 프레임워크 에서만 볼수 있는
- for 순회 중 특정 요소가 삭제되어 인덱싱이 변경 되므로 발생 (like StringTokenizer.next())
- 객체 원본 자체를 건드리면 안됨
public class Main {
public static void main(String[] args) {
List<String> stringList = init();
error(stringList);
}
public static List<String> init() {
List<String> stringList = new ArrayList<>();
stringList.add("a");
stringList.add("b");
stringList.add("c");
stringList.add("d");
stringList.add("a");
return stringList;
}
public static void error(List<String> stringList) {
System.out.println("stringList = " + stringList);
for( String str : stringList ) {
if ( str.equals("a") ) {
stringList.remove(str);
}
}
System.out.println("stringList = " + stringList);
}
public static void solution1(List<String> stringList) {
System.out.println("stringList = " + stringList);
for( int i = stringList.size() - 1; i >= 0; i-- ) {
String str = stringList.get(i);
if ( str.equals("a") ) {
stringList.remove(str);
}
}
System.out.println("stringList = " + stringList);
}
public static void solution2(List<String> stringList) {
List<String> removed = new ArrayList<>();
for ( String str : stringList ) {
if ( str.equals("a") ) {
removed.add(str);
}
}
stringList.removeAll(removed);
System.out.println("stringList = " + stringList);
}
public static void solution3(List<String> stringList) {
stringList.removeIf(str -> str.equals("a"));
System.out.println("stringList = " + stringList);
}
public static void solution4(List<String> stringList) {
System.out.println("stringList = " + stringList);
try {
for( String str : stringList ) {
if ( str.equals("a") ) {
stringList.remove(str);
}
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("stringList = " + stringList);
}
public static void solution5(List<String> stringList) {
System.out.println("stringList = " + stringList);
for( String str : stringList ) {
if ( str.equals("a") ) {
stringList.remove(str);
break;
}
}
System.out.println("stringList = " + stringList);
}
public static void solution6(List<String> stringList) {
System.out.println("stringList = " + stringList);
Iterator<String> iterator = stringList.iterator();
while(iterator.hasNext()) {
String str = iterator.next();
if ( str.equals("a") ) {
iterator.remove();
}
}
System.out.println("stringList = " + stringList);
}
public static void solution7(List<String> stringList) {
List<String> copy = new CopyOnWriteArrayList<>(stringList);
System.out.println("copy = " + copy);
for( String str : copy ) {
if ( str.equals("a") ) {
copy.remove(str);
}
}
System.out.println("copy = " + copy);
}
}