Java/컬렉션

[Java]ArrayList 특정 값 삭제

DevStory 2022. 5. 30.

이번 포스팅은 ArrayList에서 특정 값 삭제하는 방법을 소개합니다.


ArrayList.remove() - 인덱스

remove() 메서드에 지정된 위치(인덱스)를 전달합니다. 해당 위치에 있는 요소를 제거하고 뒤에 있는 요소는 왼쪽으로 이동합니다.

 

remove() 메서드는 삭제된 요소를 반환합니다.

 

다음 예제는 remove() 메서드에 인덱스를 전달하는 방법과 반환된 값을 보여줍니다.

ArrayList<String> stringArrayList = new ArrayList<>();
stringArrayList.add("One");
stringArrayList.add("Two");
stringArrayList.add("Three");
stringArrayList.add("Four");

System.out.println("1 번째 인덱스 삭제 전");
System.out.println(stringArrayList);

System.out.println("\nremove() 메서드 반환 결과");
System.out.println(stringArrayList.remove(1));

System.out.println("\n1 번째 인덱스 삭제 후");
System.out.println(stringArrayList);

실행 결과

1 번째 인덱스 삭제 전
[One, Two, Three, Four]

remove() 메서드 반환 결과
Two

1 번째 인덱스 삭제 후
[One, Three, Four]

ArrayList.remove() - 값

ArrayList의 remove() 메서드에는 지정된 위치뿐만 아니라 값도 전달할 수 있습니다. ArrayList 객체에 해당 값이 존재하는 경우 해당 요소를 제거합니다.

 

다음 예제는 remove() 메서드에 "Two"를 전달한 결과를 보여줍니다.

ArrayList<String> stringArrayList = new ArrayList<>();
stringArrayList.add("One");
stringArrayList.add("Two");
stringArrayList.add("Three");
stringArrayList.add("Four");

System.out.println("\"Two\" 삭제 전");
System.out.println(stringArrayList);

System.out.println("\nremove() 메서드 반환 결과");
System.out.println(stringArrayList.remove("Two"));

System.out.println("\n\"Two\" 삭제 후");
System.out.println(stringArrayList);

실행 결과

"Two" 삭제 전
[One, Two, Three, Four]

remove() 메서드 반환 결과
true

"Two" 삭제 후
[One, Three, Four]

인덱스를 전달하는 방법과 다르게 불리언 값을 반환하였습니다. remove() 메서드에 전달된 값을 ArrayList 객체에서 제거하였다면 true를 반환하고 그렇지 않으면 false가 반환됩니다.


ArrayList의 요소가 숫자인 경우

그렇다면, ArrayList의 요소가 숫자인 경우 remove() 메서드는 전달된 값을 인덱스로 인식할까요? 값으로 인식할까요?

 

다음 예제를 통해 알아보겠습니다.

ArrayList<Integer> integerArrayList = new ArrayList<>();
integerArrayList.add(1);
integerArrayList.add(2);
integerArrayList.add(1);
integerArrayList.add(2);

System.out.println("remove() 메서드 호출 전");
System.out.println(integerArrayList);

System.out.println("\nremove() 메서드 반환 결과");
System.out.println(integerArrayList.remove(1));

System.out.println("\nremove() 메서드 호출 전");
System.out.println(integerArrayList);

실행 결과

remove() 메서드 호출 전
[1, 2, 1, 2]

remove() 메서드 반환 결과
2

remove() 메서드 호출 후
[1, 1, 2]

remove() 메서드가 불리언 값이 아닌 Integer 값을 반환했으므로 인덱스로 인식한다는 것을 알 수 있습니다.


ArrayList.removeIf()

ArrayList에서 여러 요소를 제거하고 싶은 경우 removeIf() 메서드를 사용할 수 있습니다. removeIf() 메서드는 Java 8부터 사용할 수 있으며 주어진 조건을 만족하는 요소들을 제거합니다.

 

다음 예제는 2보다 큰 요소들을 제거합니다.

ArrayList<Integer> integerArrayList = new ArrayList<>();
integerArrayList.add(1);
integerArrayList.add(2);
integerArrayList.add(3);
integerArrayList.add(4);

System.out.println("removeIf() 메서드 호출 전");
System.out.println(integerArrayList);

System.out.println("\nremoveIf() 메서드 반환 결과");
System.out.println(integerArrayList.removeIf(item -> item > 2));

System.out.println("\nremoveIf() 메서드 호출 후");
System.out.println(integerArrayList);

실행 결과

removeIf() 메서드 호출 전
[1, 2, 3, 4]

removeIf() 메서드 반환 결과
true

removeIf() 메서드 호출 후
[1, 2]

removeIf() 메서드는 해당 조건을 만족하는 요소가 하나라도 존재하는 경우 true를 반환하고 그렇지 않으면 false를 반환합니다.


반복자(Iterator)

ArrayList의 요소를 제거하는 또 다른 방법으로 반복자를 사용할 수 있습니다. ArrayList 객체를 반복자로 변환 후 특정 값을 존재하면 remove() 메서드를 호출합니다.

 

다음 예제는 반복자를 순회하면서 값이 "Two"인 경우 반복자의 remove() 메서드를 호출하여 ArrayList 객체의 요소를 제거합니다.

ArrayList<String> stringArrayList = new ArrayList<>();
stringArrayList.add("One");
stringArrayList.add("Two");
stringArrayList.add("Three");
stringArrayList.add("Four");

System.out.println("반복자 생성 전");
System.out.println(stringArrayList);

Iterator<String> iterator = stringArrayList.iterator();

while(iterator.hasNext()) {
  String str = iterator.next();

  if(str.equals("Two")) {
    iterator.remove();
    // stringArrayList.remove(str);을 호출하면 ConcurrentModificationException 예외 발생
  }
}

System.out.println("\n반복자 생성 후");
System.out.println(stringArrayList);

실행 결과

반복자 생성 전
[One, Two, Three, Four]

반복자 생성 후
[One, Three, Four]

ArrayList의 요소가 사용자 정의 클래스

ArrayList 요소가 사용자 정의 클래스 타입인 경우 ArrayList의 remove() 메서드를 사용할 수 없습니다. removeIf() 메서드 또는 반복자를 사용하여 ArrayList의 요소를 제거할 수 있습니다.

 

다음은 예제에서 사용될 사용자 정의 클래스입니다.

public class Person {
  private String name;
  private Integer age;

  public String getName() {
    return name;
  }

  public Integer getAge() {
    return age;
  }

  Person(String name, Integer age) {
    this.name = name;
    this.age = age;
  }

  @Override
  public String toString() {
    return "Person{" +
            "name='" + name + '\'' +
            ", age=" + age +
            '}';
  }
}

 

다음 예제는 removeIf() 메서드를 사용하여 age가 10보다 큰 요소를 제거합니다.

ArrayList<Person> personArrayList = new ArrayList<>();
personArrayList.add(new Person("Tom" ,10));
personArrayList.add(new Person("Nick" ,20));
personArrayList.add(new Person("Bob" ,30));

System.out.println(personArrayList);

personArrayList.removeIf((item) -> item.getAge() > 10);

System.out.println(personArrayList);

실행 결과

[Person{name='Tom', age=10}, Person{name='Nick', age=20}, Person{name='Bob', age=30}]
[Person{name='Tom', age=10}]

 

다음 예제는 반복자를 사용하여 age가 10보다 큰 요소를 제거합니다.

ArrayList<Person> personArrayList = new ArrayList<>();
personArrayList.add(new Person("Tom" ,10));
personArrayList.add(new Person("Nick" ,20));
personArrayList.add(new Person("Bob" ,30));


System.out.println(personArrayList);

Iterator<Person> iterator = personArrayList.iterator();

while(iterator.hasNext()) {
  if(iterator.next().getAge() > 10) {
    iterator.remove();
  }
}

System.out.println(personArrayList);

실행 결과

[Person{name='Tom', age=10}, Person{name='Nick', age=20}, Person{name='Bob', age=30}]
[Person{name='Tom', age=10}]

정리

  • 특정 위치(인덱스)에 존재하는 ArrayList 객체의 요소를 제거하고 싶은 경우 ArrayList의 remove() 메서드에 인덱스를 전달합니다.
  • 특정 값을 만족하는 ArrayList 객체의 요소를 제거하고 싶은 경우 ArrayList의 remove() 메서드에 값을 전달합니다.
  • 특정 조건을 만족하는 ArrayList 객체의 요소를 제거하고 싶은 경우 removeIf() 메서드 또는 반복자를 사용합니다.
  • ArrayList의 타입이 사용자 정의 클래스인 경우 remove() 메서드 또는 반복자를 사용하여 ArrayList 객체의 요소를 제거할 수 있습니다.
반응형

댓글