JAVA

23-02-02(2) JAVA (set인터페이스, Hash, Tree)

모건이삼촌 2023. 2. 2. 17:21

 

1. List 인터페이스

 

add, get

add : 추가 add( ? ) <- 파라미터 값이 중요함.

get : 조회 ?get <- 파라미터가 없고 리턴이 있음

 

2. Set 인터페이스

중복을 허용하지않고, 저장순서가 유지되지않는 컬렉션인터페이스다.

구현클래스로는 HashSet, LinkedHashSet, TreeSet이 있다.

HashSet은 저장순서를 알수없고

LinkedHashSet 저장순서를 알수있고

TreeSet 순서를 기억하는 구조이다.

 

p.372 표 삽입필요

 

예제)

package chapter13;

import java.util.HashSet;
import java.util.Set;

public class SetEx {
	public static void main(String[] args) {
		HashSet<Integer> set = new HashSet<Integer>();
		set.add(1); //true
		set.add(2); //true
		set.add(3); //true
		set.add(2); //false
		set.add(3); //false
		System.out.println(set);
		
		HashSet<Integer> set2 = new HashSet<Integer>();
		set2.add(3);
		set2.add(2);
		set2.add(4);
		System.out.println(set2);
		
		Set<Integer> target = new HashSet<>(set);
		System.out.println("=====================");
		target.retainAll(set2);
		System.out.println(target); // 교집합

		target = new HashSet<>(set);
		System.out.println("=====================");
		target.addAll(set2);
		System.out.println(target); // 합집합

		target = new HashSet<>(set);
		System.out.println("=====================");
		target.removeAll(set2);
		System.out.println(target); // 차집합
	}
	

}

package chapter13;

public class Addr {
	String tel;
	String name;
	public Addr(String tel, String name) {
		this.tel = tel;
		this.name = name;
	}
	@Override
	public String toString() {
		return "Addr [tel=" + tel + ", name=" + name + "]";
	}
	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		return tel.equals(((Addr)obj).tel);
	}
	@Override
	public int hashCode() {
		return tel.hashCode(); 
	}
	
	

}
package chapter13;

import java.util.HashSet;
import java.util.Set;

public class AddrEx {
	public static void main(String[] args) {
		System.out.println("1111".hashCode());
		System.out.println(new String("1111").hashCode());
		System.out.println(new Addr("1111", "홍길동").hashCode());
		
		
		Set<Addr> addrs = new HashSet<Addr>();
		addrs.add(new Addr("1111", "홍길동"));
		addrs.add(new Addr("2222", "고길동")); // 인스턴스를 같이 만듬
		
		Addr addr = new Addr("3333", "김길동"); // 따로 만듬
		addrs.add(addr);
		addrs.add(addr); // 중복을 배제하기 때문에 출력시 3개만 나옴
		addrs.add(new Addr("1111", "홍길동"));
		
		System.out.println(addrs);
		
		String str1 = "abcb";
		String str2 = new String("abcd");
		
		System.out.println(str1.equals(str2));
		System.out.println(str1.compareTo(str2));
	}

}

set은 중복처리가 힘들다 위 예제를 보고 중복처리에 대한 것을 확인하자.

 

 해시 함수(Hash Function)

탐색에 대한 속도향상을 위한 처리방법

 

※ 트리 (Tree)

node(요소)

트리는 부모가 무조건 하나이며 자식은 여러개 올 수 있다 (상속과 비슷함)

자식이 0개에서 최대 2개가 되면 2진트리라고 한다.

제일 조상 노드는 root node라고 하고 제일 최하단에 있는 노드를 leaf node라고 한다.

LTR : 정렬순서 (Left Top Right)

트리구조는 입출력시 정렬하려고 사용한다.

트리자료구조형을 사용하기 위해선 반드시 대상 자료형이 비교가 가능한 자료형 이여야 한다.. [제대로 못들음 ㅠ..]

 

트리구조 예제)

package chapter13;

import java.util.Objects;

public class Addr implements Comparable<Addr>{
	String tel;
	String name;
	public Addr(String tel, String name) {
		this.tel = tel;
		this.name = name;
	}
	@Override
	public String toString() {
		return "Addr [tel=" + tel + ", name=" + name + "]";
	}
	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		return tel.equals(((Addr)obj).tel) && name.equals(((Addr)obj).name);
	}
	@Override
	public int hashCode() {
//		return tel.hashCode() + name.hashCode();
		return Objects.hash(tel, name);
	}
	@Override
	public int compareTo(Addr o) {
		return tel.compareTo(o.tel);
		// 전화번호를 가지고 오름차순을 하겠다는 뜻 
		// return 바로 뒤에 나오는 tel에 -기호를 넣으면 내림차순이 된다.
	}
	
	

}
package chapter13;

import java.util.Set;
import java.util.TreeSet;

public class SetEx2 {
	public static void main(String[] args) {
		Set<Addr> addrs = new TreeSet<Addr>();
		addrs.add(new Addr("1111", "홍길동"));
		addrs.add(new Addr("1115", "홍길동"));
		addrs.add(new Addr("1113", "홍길동"));
		addrs.add(new Addr("1112", "홍길동"));
		addrs.add(new Addr("1114", "홍길동"));
		
		System.out.println(addrs);
	}

}