[Java] 자바 배열 중복값(Overlap) 제거 / 처리/ 방법 알아보기.

2021-02-03


자바에서 배열 사용간 배열 내부의 데이터들의 중복된 값을 제거하고 싶을 수가 있다. 이러한 경우에서의 해결방법을 알아보자.


  • 1. Set 컬렉션 사용
package ArraysOverlap;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.stream.Stream;

public class main {

	public static void main(String[] args) {
		
		//방법 1.
		
		int [] arr = {1,1,1,2,3,4,5,5,5,6,7};
		//중복된 값을 다수 가지는 int 배열 선언
		
		Set<Integer> set = new HashSet<>();
		// set의 자료 구조를 사용하는 것이다.
		//set은 중복된 값을 중복 저장할 수 없기 때문에
		// 중복된 값은 자동으로 처리해 중복되지 않은
		//데이터만 저장된다. (다른 set 구조를 사용해도 된다.)
		
		for(int loop : arr) {
			set.add(loop);
		}// 배열의 있는 값을 하나씩 뽑아주준다.
		
		Stream<Integer> setS = set.stream();		
		setS.forEach(out -> System.out.print(out + " "));
		//그대로 set 자체로 출력하면 중복이 제거된 데이터만
		// 출력되는 것을 확인할 수 있다.
		
		System.out.println();
		int [] newArr = new int [set.size()];
		Iterator<Integer> it = set.iterator();
		for(int i = 0; i < newArr.length; i++ ) {
			newArr[i] = it.next();
			System.out.print(newArr[i] + " ");
		}
		
		//위 처럼 새로운 배열을 만들어서 다시 set으로 넣어주면
		// 다시 배열로도 사용할 수 있다.
	}

}

 

우선 초기 중복된 값을 다수 가지고 있는 arr이라는 배열을 선언해주었다. 해당 방법은 set 컬렉션의 특징인 "중복된 값은 저장하지 않는다." 라는 특징을 활용하는 방법으로 forEach 구문을 사용하여 전체 배열의 항목들을 하나씩 꺼내 set에 넣어주는 방식이다. 이후 stream을 활용해 set에 저장되어 있는 각 항목들의 값을 출력해 보면, 중복된 값 없이 데이터가 저장된 것을 확인할 수 있으며, 이후 다시 배열의 형태로 만들고 싶으면 Iterator를 통해 다시 배열에 담아주면 된다. 출력 결과를 보면 두 경우 모두 중복된 값을 제거된 데이터가 저장된 것을 확인할 수 있다.

 


  • 1. ArrayList 사용
package ArraysOverlap;

import java.util.ArrayList;

public class main {

	public static void main(String[] args) {
//		//방법 2.
		int [] arr = {1,1,1,2,3,4,5,5,5,6,7};
		//중복된 값을 다수 가지는 int 배열 선언
		
		ArrayList<Integer> list = new ArrayList<>();
		
		
		for(int checkData : arr) {
			if(!list.contains(checkData)) {
				//리스트의 contains 메서드를 활용해
				//리스트 내부의 데이터를 체크해 본다.
				//이후 중복 데이터가 없을 경우 그 값을 
				// add 를 통해 넣어준다.
				list.add(checkData);
			}
		}
		
		System.out.println(list);
		//출력결과 중복된 데이터를 제외하고 저장된 것을 확인할 수 있다.
		
		
		int [] newArr = new int [list.size()];
		// list의 크기 만큼 새로운 배열을 선언해준다.
		for(int i = 0; i < newArr.length; i++ ) {
			newArr[i] = list.get(i);
		}
		// get을 통해 중복값을 제외하고 선언한 배열에
		// 하나씩 넣어준다.
		
		
		for(int i = 0; i < newArr.length; i++ ) {
			System.out.print(newArr[i] + " ");
		}
		// list의 데이터를 그대로 담아주어 
		// 새로운 배열역시 중복된 값이 제거된 것을 확인할 수 있다.
		
	}

}

 

다음은 ArrayList와 함께 List에서 제공하는 메서드를 사용하는 방법이다. 먼저 리스트 객체를 하나 우선 생성해 준다.  그 후 contains 메서드를 사용해 list 내부의 데이터를 체크해 기존에 없는 데이터일 경우 add 메서드를 통해 리스트 객체에 담아주면 된다. 결과적으로 출력해보면, 중복된 값이 제거되어 list에 담긴 것을 확인할 수 있으며, 마찬가지로 배열에 다시 담고 싶으면, get 메서드로 하나씩 list에서 꺼내서 넣어주면 된다. 실행결과를 확인해보면 중복된 값이 모두 제거된 것을 확인할 수 있다.