어제 오늘 내일

[Java] List에 특정 값이 포함되어 있는지 확인하기 본문

IT/Java

[Java] List에 특정 값이 포함되어 있는지 확인하기

hi.anna 2021. 5. 4. 06:04

 

List에 특정 값이 포함되어 있는지 확인하는 방법입니다.

  1. contains()
  2. indexOf()
  3. 반복문
  4. Iterator를 사용한 반복문
  5. Stream API

 

 

1. contains()

  코드  

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ListValueCheck {
    public static void main(String[] args) {

        List<String> list = new ArrayList<>(Arrays.asList("Hello", "Hi"));

        // 포함 여부 체크
        boolean isContainsHello = list.contains("Hello");
        boolean isContainsBye = list.contains("Bye");

        // 결과 출력
        System.out.println(isContainsHello); // true
        System.out.println(isContainsBye);   // false
    }
}

  결과  

true
false

List의 contains() 메소드는, List안에 같은 값이 있으면  true를, 없으면 false를 리턴합니다.

여기에서, 같은 값이라는 의미는,

List안에 들어있는 객체의 equals() 메소드에 정의됩니다.

이 equals() 메소드가 true를 리턴하면 같은 값이라고 판단하고, false이면 다른 값이라고 판단합니다.

 

위 예제에서, List에 들어있는 객체는 String 객체입니다.

String 객체에는, 두 개의 String 값을 비교하는 equals() 메소드가 정의되어 있습니다.

우리 예제에서 사용된 contains() 메소드는,

List에 있는 값들과 "Hello"라는 문자열을 같은지를 String 클래스의 equals() 메소드를 이용하여 판단하는 것입니다.

 

그렇다면,

List 객체에 사용자가 정의한 객체들이 들어가 있고,

위 예제와 같이 List의 contains()  메소드를 사용하여 

List가 특정 객체를 포함하고 있는지 확인하려면,

먼저 사용자가 정의한 객체에 equals() 메소드를 정의해야 합니다.

 

equals() 메소드 정의하기

이번 예제는 Product 클래스에 equals() 메소드를 Override하여 재정의하여,

List의 contains() 메소드로 값을 찾는 예제입니다.

  Product.java  

public class Product {
    int id;
    String name;

    public Product(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public boolean equals(Object object) {
        Product product = (Product) object;

        // name은 상관없이, id만 같으면 true를 리턴합니다.
        if (product.id == this.id) {
            return true;
        }
        return false;
    }
}

  ListValueCheck.java  

import java.util.ArrayList;
import java.util.List;

public class ListValueCheck {
    public static void main(String[] args) {

        List<Product> list = new ArrayList<>();
        list.add(new Product(1, "TV"));
        list.add(new Product(2, "Computer"));

        // id=2, name=Car 포함 여부 체크
        boolean carContains = list.contains(new Product(2, "Car"));
        System.out.println(carContains);  // true

        // id=3, name="Computer" 포함 여부 체크
        boolean computerContains = list.contains(new Product(3, "Computer"));
        System.out.println(computerContains);  // false
    }
}

  결과  

true
false

Product 클래스의 equals() 메소드

Product에는 id와 name 두개의 field가 있지만,

equals() 메소드에서는 id만 같으면 true를 리턴하도록 하였습니다.

 

따라서, ListValueCheck 클래스의 main() 에서

List의 contains() 메소드로 특정 객체가 List에 포함되어 있는지 판단할 때,

Product의 id만 같으면 (name은 상관없이) true를 리턴하는 것을 확인 할 수 있습니다.

 

 

2. indexOf()

  코드  

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ListValueCheck {
    public static void main(String[] args) {

        List<String> list = new ArrayList<>(Arrays.asList("Hello", "Hi"));

        // Hello 포함 여부 체크
        int helloIndex = list.indexOf("Hello");
        System.out.println("Hello Index : " + helloIndex); // 0

        if (helloIndex >= 0) {
            System.out.println("Hello는 List에 포함된 문자열입니다."); // printed
        }

        // Bye 포함 여부 체크
        int byeIndex = list.indexOf("Bye");
        System.out.println("Bye Index : " + byeIndex); // -1

        if (byeIndex >= 0) {
            System.out.println("Bye는 List에 포함된 문자열입니다."); // not printed
        }
    }
}

  결과  

Hello Index : 0
Hello는 List에 포함된 문자열입니다.
Bye Index : -1

List의 indexOf() 메소드는 같은 객체가 List에 있으면,

해당 객체가 나타나는 첫번째 index 값을 리턴합니다.

만약, List에 같은 값이 없으면 -1을 리턴합니다.

이러한 점을 이용하면, indexOf()의 리턴값이 음수인지, 양수인지 체크하여

특정 객체가 List안에 있는지 판단할 수 있습니다.

(이때도, contains() 메소드와 같이, 같은 객체를 찾을 때, equals() 메소드를 활용합니다.)

 

 

 

3. 반복문

forEach 문을 사용하여

특정값이 List에 있는지 직접 찾을 수 있습니다.

  코드  

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ListValueCheck {
    public static void main(String[] args) {

        List<String> list = new ArrayList<>(Arrays.asList("Hello", "Hi"));

        // Hello 포함 여부 체크
        for (String str : list) {
            if ("Hello".equals(str)) {
                System.out.println("Hello는 리스트에 포함된 문자열입니다.");
            }
        }

    }
}

  결과  

Hello는 리스트에 포함된 문자열입니다.

 

 

 

4. Iterator를 사용한 반복문

Iterator를 이용해서 반복문을 수행할 수도 있습니다.

  코드  

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class ListValueCheck {
    public static void main(String[] args) {

        List<String> list = new ArrayList<>(Arrays.asList("Hello", "Hi"));

        // Hello 포함 여부 체크
        Iterator<String> it = list.iterator();
        while (it.hasNext()) {
            String str = it.next();
            if ("Hello".equals(str)) {
                System.out.println("Hello는 리스트에 포함된 문자열입니다.");
            }
        }
    }
}

  결과  

Hello는 리스트에 포함된 문자열입니다.

 

 

 

5. Stream API

Java 8 버전 이후에는, Stream API의 filter() 메소드를 이용할 수도 있습니다.

  코드  

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ListValueCheck {
    public static void main(String[] args) {

        List<String> list = new ArrayList<>(Arrays.asList("Hello", "Hi"));

        // Hello 포함 여부 체크
        long count = list.stream().filter(str -> "Hello".equals(str)).count();
        System.out.println("Count : " + count);
        if (count > 0) {
            System.out.println("Hello는 리스트에 포함된 문자열입니다.");
        }
    }
}

  결과  

Count : 1
Hello는 리스트에 포함된 문자열입니다.

위 예제에서는

filter(str -> "Hello".equals(str));

Stream의 filter()에 "Hello"가 List에 존재하는지 판단하는 메소드를 전달하여,

조건을 만족하는 값만을 포함하는 Stream을 리턴 받고,

count();

다시 count() 메소드를 호출하여, stream에 몇개의 element가 있는지를 체크합니다.

만약, count() 에서 리턴받은 값이 0보다 크면,

List에 "Hello"가 존재하는 거겠죠?

 


 

List에 특정값이 존재하는지 체크하는 다양한 방법을 알아보았습니다.

 

 

반응형
Comments