본문 바로가기
JAVA

2022-10-27 컬렉션 프레임웍 - ArrayList, HashSet, HashMap

by HTT 2022. 10. 29.

컬렉션 프레임웍



: 데이터 군을 저장하는 클래스들을 표준화한 설계

 

 

HashSet

 

- Set인터페이스를 구련한 가장 대표적인 컬렉션

- Set인터페이스의 특징대로 HashSet은 중복된 요소를 저장하지 않는다(객체를 저장하기 전에 기존에 같은 객체가 있는지 확인함).

- 새로운 요소 추가 => add, addAll 메소드 사용

=> 중복된 요소 추가 시 false반환

 

package datastructure;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;

public class HashSetTest {

	public static void main(String[] args) {
		ArrayList<String> list = new ArrayList<String>();
		list.add("java");
		list.add("서블릿");
		list.add("js");
		list.add("스프링");
		list.add("스프링");
		int size = list.size();
		for(String str : list) {  // list만큼 꺼내서 str에 담는다
			System.out.println(str);
		}
		System.out.println();
		
		//집합 - 데이터를 중복해서 저장할 수 없다.
		//HashSet생성
		HashSet<String> set = new HashSet<String>();
		//set에 데이터 넣기
		set.add("java");
		set.add("서블릿");
		set.add("js");
		set.add("스프링");
		set.add("스프링");
		System.out.println("크기는? "+set.size());  // 스프링은 중복이니까 5가 아니라 4
		System.out.println(set.contains("스프링")); // 스프링이 들어가 있는가? Yes => true
		
		// Set은 선형구조가 아니라 순서대로 읽을 수 없다
		// 전체 데이터를 엑세스하는 경우 표준 포맥인 Iterator로 변환 후 읽는다.
		// => HashSet을 Iterator로 변환하기
		Iterator<String> it = set.iterator();
		// Iterator에 담긴 데이터 꺼내기
		while(it.hasNext()) {//Iterator에 담긴 데이터가 있는 동안 반복작업
  							 //(Iterator에 데이터가 있으면 true리턴, 없으면 false리턴)
			String data = it.next(); // Iterator에 저장된 데이터 꺼내기
		}
		set.remove("스프링");
		System.out.println("크기는??? "+set.size());
		
		// HashSet을 배열로 변환
		System.out.println("===============================================");
		//set으로 배열객체를 생성
		String[] myarr = new String[set.size()]; //set크기만큼의 배열 생성
		//set을 배열로 변환
		set.toArray(myarr); //myarr배열에 set의 데이터를 저장
		
		//String[] myarr = set.toArray(new String[0]); // set을 String배열 객체에 저장됨
		// 사이즈가 0인 배열이 만들어지면서 배열로 변환
		for (int i = 0; i < myarr.length; i++) {
				System.out.println(myarr[i]);		
			}
			System.out.println(myarr[0].length());  // myarr[0] 값의 문자열의 길이를 출력. java이므로 4
	}

}

 

 * 주의할 점

int size = list.size();
	for(String str : list) { 
		System.out.println(str);
	}

=> for문 조건 안에 list.size()를 넣게 되면 size메소드가 계속 반복되면서 사용하는 공간이 늘어나게 됨

     꼭! 새로 변수 선언을 한 후 담아주기.

 

 

 

- HashSet의 합집합, 교집합

package datastructure;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class HashSetTest2 {

	public static void main(String[] args) {
		HashSet<String> set = new HashSet<String>();
		set.add("java");
		set.add("서블릿");
		set.add("js");
		set.add("스프링");
		set.add("css");
		set.add("오라클");
		set.add("html");
		print(set);
		
		//합집합 - set을 생성할 때 매개변수로 또 다른 set객체를 넘기기
		HashSet<String> set2 = new HashSet<String>(set);
		set2.add("hadpop");
		set2.add("had");
		set2.add("pop");
		print(set2);
		
		//교집합
        //set3의 데이터 + set3과 set이 겹치는 데이터만 담는다.
		HashSet<String> set3 = new HashSet<String>();
		set3.add("java");
		set3.add("python");
		set3.add("python2");
		set3.add("html");
		print(set3);
		
		System.out.println("set2와 set3의 합집합");
		set2.addAll(set3); //주어진 컬렉션에 저장된 모든 객체들을 추가한다.
		print(set2);
		
		System.out.println("set3와 set의 교집합 - 교집합이 set3에 새로 설정");
		set3.retainAll(set); //set3과 set이 겹치는 데이터만 담는다. => java, html
		print(set3);
	}
	
	public static void print(Set<String> set) {
		System.out.println("요소의 갯수 : "+set.size());
		Iterator<String> it = set.iterator();
		while(it.hasNext()) {
			System.out.println("set에 저장된 요소 => "+it.next());
		}
		System.out.println("---------------------------------");
	}
}

 

 

 

- HashSet의 차집합

package datastructure;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class HashSetTest3 {

	public static void main(String[] args) {
		HashSet<String> set = new HashSet<String>();
		set.add("java");
		set.add("jsp");
		set.add("서블릿");
		set.add("스프링");
		set.add("오라클");
		set.add("css");
		set.add("swing");
		print(set);
		
		HashSet<String> set2 = new HashSet<String>();
		set2.add("java");
		set2.add("jsp");
		print(set2);
		
		HashSet<String> set3 = new HashSet<String>();
		set3.add("java");
		set3.add("jsp");
		set3.add("hadoop");
		set3.add("android");
		print(set3);
		
		System.out.println(set.containsAll(set2));
		System.out.println(set.containsAll(set3));  // set에 없는 요소가 있기 때문에 false
		set3.removeAll(set); // set의 내용 없애버림
		print(set3);
	}

 

 

 

- List, HashSet, HashMap 자유롭게 변경하기

* toArray등 메소드 사용하지 않고 직접 해보기

package datastructure;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Exam {

	public static void main(String[] args) {
		ArrayList<String> list = new ArrayList<String>();
		list.add("java");
		list.add("서블릿");
		list.add("js");
		list.add("스프링");
		list.add("스프링");

		HashSet<String> set = new HashSet<String>();
		set.add("java");
		set.add("jsp");
		set.add("서블릿");
		set.add("스프링");
		set.add("오라클");
		set.add("css");
		set.add("swing");

		HashMap<Integer, String> map = new HashMap<Integer, String>();
		map.put(1, "java");
		map.put(2, "servlet");
		map.put(3, "spring");
		map.put(4, "swing");

		print(list);
		print(set);
		print(map.values());
		
		String[] listarr = change(list);
		// 1. listarr의 값 출력하기
		System.out.println("1번  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
		for(String data : listarr) {
			System.out.println("main : "+data);
		}

		ArrayList<String> setlist = change(set);
		// 2. setlist의 값 출력하기
		System.out.println("2번  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
		for(String data : setlist) {
			System.out.println("main : "+data);
		}

		// 3. 3번에서 만든 메소드 호출하고 값 출력하기
		System.out.println("3번  =================================");
		String[] arr = prinyMapKey(map);
		for(String str : arr) {
			System.out.println(str);
		}
	}

	// 모든 자료구조의 값들을 출력할 수 있도록 작성하기
	//main-> static메소드. static메소드에서 non-static 메소드를 호출하기 위해서는 객체생성 해줘야 함(혹은 메소드에 static붙이기).
	//                   => Exam obj = new Exam();
	public static void print(Collection<String> data) { // 컬렉션에 들어갈 데이터타입은 String이다.
//		Iterator<String> it = data.iterator();
//		while(it.hasNext()) {
//			System.out.println(it.next()+"\t");
//		}
		for(String str : data) {
			System.out.println(str+"\t");
		}
		System.out.println("--------------------------------------------------");
	}

	// 1. ArrayList를 배열로 변환해서 리턴하기
	public static String[] change(ArrayList<String> list) {
		String[] listarr = new String[list.size()];
		int size = list.size();
		for (int i = 0; i < size; i++) {
			listarr[i] = list.get(i);
		}
		return listarr;
	}
	
	// 2. HashSet을 ArrayList로 변환해서 리턴하기
	public static ArrayList<String> change(Set<String> set) {
		ArrayList<String> setlist = new ArrayList<String>(set.size());
		Iterator<String> it = set.iterator();
		while (it.hasNext()) {
			setlist.add(it.next());  //Set의 데이터가 setlist에 담김
		}
		return setlist;
	}
	
	// 3. Map의 키와값들을 추출하여 sysout으로 출력하고 value는 String[]에 담아 리턴하기
	public static String[] prinyMapKey(HashMap<Integer, String> map) {
		String[] myarr = new String[map.size()];
		Set<Integer> keylist = map.keySet();
		Iterator<Integer> it = keylist.iterator();
		int i=0;
		while(it.hasNext()) {
			int key = it.next();
			System.out.println("key"+key);
			myarr[i] = map.get(key);
			i++;
		}
		return myarr;
	}
	
}

댓글