Java

[Java-기초] set μΈν„°νŽ˜μ΄μŠ€

μ½”λ”©ν•˜λŠ” λΆ•μ–΄ 2021. 2. 22. 03:19
λ°˜μ‘ν˜•

β–Ά set μΈν„°νŽ˜μ΄μŠ€

​

*HashSet 클래슀

HashSet ν΄λž˜μŠ€λŠ” μ§‘ν•© 자료 ꡬ쑰λ₯Ό κ΅¬ν˜„ν•˜λ©° 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€.

​

​

HashSetTest.java

package collection.hashset;

import java.util.HashSet;

public class HashSetTest {
	public static void main(String[] args) {
		HashSet<String> hashSet = new HashSet<String>();
		hashSet.add(new String("μž„μ •μˆœ"));
		hashSet.add(new String("λ°•ν˜„μ •"));
		hashSet.add(new String("ν™μ—°μ˜"));
		hashSet.add(new String("강감찬"));
		hashSet.add(new String("강감찬"));

		System.out.println(hashSet);
	}
}

<μ‹€ν–‰ κ²°κ³Ό>

-강감찬이 1λͺ…λ§Œ 좜λ ₯됨.

 

 

 

*HashSetλ₯Ό ν™œμš©ν•΄ νšŒμ› 관리 ν”„λ‘œκ·Έλž¨ κ΅¬ν˜„ν•˜κΈ°

​

MemberHashSet.java

package collection.hashset;

import java.util.HashSet;
import java.util.Iterator;

import collection.Member;

public class MemberHashSet {
	private HashSet<Member> hashSet;

	public MemberHashSet() {
		hashSet = new HashSet<Member>();
	}

	public void addMember(Member member) {  // HashSet에 νšŒμ› μΆ”κ°€
		hashSet.add(member);
	}

	public boolean removeMember(int memberID) {  // λ§€κ°œλ³€μˆ˜λ‘œ 받은 νšŒμ› 아이디에 ν•΄λ‹Ήν•˜λŠ” νšŒμ› μ‚­μ œ 
		Iterator<Member> ir = hashSet.iterator();

		while (ir.hasNext()) {
			Member member = ir.next();           // νšŒμ›μ„ ν•˜λ‚˜μ”© κ°€μ Έμ™€μ„œ
			int tempId = member.getMemberID();   // 아이디 비ꡐ
			if (tempId == memberID) {            // 같은 아이디인 경우
				hashSet.remove(member);          // νšŒμ› μ‚­μ œ
				return true;
			}
		}
		System.out.println(memberID + "κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.");
		return false;
	}

	public void showAllMember() {
		for (Member member : hashSet) {
			System.out.println(member);
		}
		System.out.println();
	}
}

-νšŒμ›μ„ μ‚­μ œν• λ•Œ μ“°λŠ” remove( ) λ©”μ„œλ“œκ°€ ArrayListμ™€λŠ” μ’€ λ‹€λ₯΄λ‹€. ArrayListμ—μ„œλŠ” get(i) λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄ iλ²ˆμ§Έμ— ν•΄λ‹Ήν•˜λŠ” ν•­λͺ©μ„ μ‚­μ œν–ˆμ§€λ§Œ HashSetμ—μ„œλŠ” ν•΄λ‹Ήν•˜λŠ” 아이디λ₯Ό κ°€μ§„ νšŒμ›μ„ μ°ΎκΈ° μœ„ν•΄ Iteratorλ₯Ό μ‚¬μš©ν•œλ‹€.

​

​

MemberHashSetTest.java

package collection.hashset;

import collection.Member;

public class MemberHashSetTest {
	public static void main(String[] args) {
		MemberHashSet memberHashSet = new MemberHashSet();

		Member memberLee = new Member(1001, "이지원");
		Member memberSon = new Member(1002, "손민ꡭ");
		Member memberPart = new Member(1003, "λ°•μ„œν›€");

		memberHashSet.addMember(memberLee);
		memberHashSet.addMember(memberSon);
		memberHashSet.addMember(memberPart);
		memberHashSet.showAllMember();

		Member memberHong = new Member(1003, "홍길동");  // 아이디 쀑볡 νšŒμ› μΆ”κ°€
		memberHashSet.addMember(memberHong);
		memberHashSet.showAllMember();
	}
}

<μ‹€ν–‰ κ²°κ³Ό>

-같은 아이디 1003을 κ°€μ§„ λ°•μ„œν›€κ³Ό 홍길동이 κ·ΈλŒ€λ‘œ 좜λ ₯λ˜μ—ˆλ‹€

-객체가 λ™μΌν•œ κ²½μš°μ— λŒ€ν•œ 처리 방법을 κ΅¬ν˜„ν•΄μ€˜μ•Όν•¨

​

​

​

*객체가 동일함을 κ΅¬ν˜„ν•˜κΈ°

기본적으둜 μΈμŠ€ν„΄μŠ€ μ£Όμ†Œκ°€ κ°™μœΌλ©΄ 같은 객체이닀.

Member ν΄λž˜μŠ€μ— equals( ) λ©”μ„œλ“œμ™€ hashCode( ) λ©”μ„œλ“œλ₯Ό μ œμ •μ˜ν•˜μ—¬ νšŒμ› 아이디가 κ°™μœΌλ©΄ 같은 νšŒμ›μž„μ„ κ΅¬ν˜„ν•΄ 주자.

package collection;

public class Member {
	private int memberID;
	private String memberName;

    ...

	@Override
	public int hashCode() {
		return memberID;  // HashCode() λ©”μ„œλ“œκ°€ νšŒμ› 아이디λ₯Ό λ°˜ν™˜ν•˜λ„λ‘ μž¬μ •μ˜
	}

	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Member) {
			Member member = (Member) obj;
			if (this.memberID == member.memberID)  // λ§€κ°œλ³€μˆ˜λ‘œ 받은 νšŒμ› 아이디가 μžμ‹ μ˜ νšŒμ› 아이디와 κ°™λ‹€λ©΄ true λ°˜ν™˜
				return true;
			else
				return false;
		}
		return false;
	}
}

​<μ‹€ν–‰ κ²°κ³Ό>

​

​​

​

*TreeSet 클래슀

TreeSet은 자료의 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•ŠμœΌλ©΄μ„œ 좜λ ₯ κ²°κ³Ό 값을 μ •λ ¬ν•˜λŠ” ν΄λž˜μŠ€μ΄λ‹€.

​

TreeSetTest.java

package collection.treeset;

import java.util.TreeSet;

public class TreeSetTest {
	public static void main(String[] args) {
		TreeSet<String> treeSet = new TreeSet<String>();
		treeSet.add("홍길동");
		treeSet.add("강감찬");
		treeSet.add("μ΄μˆœμ‹ ");

		for (String str : treeSet) {
			System.out.println(str);
		}
	}
}

<μ‹€ν–‰ κ²°κ³Ό>

​

 

 

*이진 검색 트리

νŠΈλ¦¬λŠ” 자료 μ‚¬μ΄μ˜ 계측 ꡬ쑰λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 자료 ꡬ쑰.

트리 자료 κ΅¬μ‘°μ—μ„œ 각 μžλ£Œκ°€ λ“€μ–΄κ°€λŠ” 곡간을 'λ…Έλ“œ'라고 ν•œλ‹€. 그리고 μœ„μ•„λž˜λ‘œ μ—°κ²°λœ λ…Έλ“œμ˜ 관계λ₯Ό 'λΆ€λͺ¨-μžμ‹ λ…Έλ“œ'라고 ν•œλ‹€. 이진 검색 νŠΈλ¦¬λŠ” λ…Έλ“œμ— μ €μž₯λ˜λŠ” 자료의 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•Šκ³ , λΆ€λͺ¨κ°€ κ°€μ§€λŠ” μžμ‹ λ…Έλ“œμ˜ μˆ˜κ°€ 2개 μ΄ν•˜μ΄λ‹€. λ˜ν•œ μ™Όμͺ½μ— μœ„μΉ˜ν•˜λŠ” μžμ‹ λ…Έλ“œλŠ” λΆ€λͺ¨ λ…Έλ“œλ³΄λ‹€ 항상 μž‘μ€ 값을 κ°€μ§„λ‹€. λ°˜λŒ€λ‘œ 였λ₯Έμͺ½μ— 놓인 μžμ‹ λ…Έλ“œλŠ” λΆ€λͺ¨ λ…Έλ“œλ³΄λ‹€ 항상 큰 값을 κ°€μ§„λ‹€. λ”°λΌμ„œ μ–΄λ–€ νŠΉμ • 값을 찾으렀 ν•  λ•Œ ν•œ μͺ½ λ…Έλ“œμ™€ 비ꡐ해 λΉ„κ΅ν•œ λ…Έλ“œλ³΄λ‹€ μž‘μ€ 값이면 μ™Όμͺ½ μžμ‹ λ…Έλ“œ λ°©ν–₯으둜, κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ 였λ₯Έμͺ½ μžμ‹ λ…Έλ“œ λ°©ν–₯으둜 μ΄λ™ν•œλ‹€.

λ”°λΌμ„œ 비ꡐ λ²”μœ„κ°€ 평균 1/2λ§ŒνΌμ”© 쀄어듀어 효과적으둜 자료λ₯Ό 검색할 수 μžˆλ‹€.

​

​

​

*TreeSet을 ν™œμš©ν•΄ νšŒμ› 관리 ν”„λ‘œκ·Έλž¨ κ΅¬ν˜„ν•˜κΈ°

​

MemberTreeSet.java

package collection.treeset;

import java.util.Iterator;
import java.util.TreeSet;

import collection.Member;

public class MemberTreeSet {
	private TreeSet<Member> treeSet;

	public MemberTreeSet() {
		treeSet = new TreeSet<Member>();
	}

	public void addMember(Member member) {
		treeSet.add(member);
	}

	public boolean removeMember(int memberID) {
		Iterator<Member> ir = treeSet.iterator();

		while (ir.hasNext()) {
			Member member = ir.next();
			int tempId = member.getMemberID();
			if (tempId == memberID) {
				treeSet.remove(member);
				return true;
			}
		}
		System.out.println(memberID + "κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.");
		return false;
	}

	public void showAllMember() {
		for (Member member : treeSet) {
			System.out.println(member);
		}
		System.out.println();
	}
}

 

 

MemberTreeSetTest.java

package collection.treeset;

import collection.Member;

public class MemberTreeSetTest {
	public static void main(String[] args) {
		MemberTreeSet memberTreeSet = new MemberTreeSet();

		Member memberPark = new Member(1003, "λ°•μ„œν›€");
		Member memberLee = new Member(1001, "이지원");
		Member memberSon = new Member(1002, "손민ꡭ");

		memberTreeSet.addMember(memberLee);
		memberTreeSet.addMember(memberSon);
		memberTreeSet.addMember(memberPark);
		memberTreeSet.showAllMember();

		Member memberHong = new Member(1003, "홍길동");  // 아이디 쀑볡 νšŒμ› μΆ”κ°€
		memberTreeSet.addMember(memberHong);
		memberTreeSet.showAllMember();
	}
}

​<μ‹€ν–‰ κ²°κ³Ό>

-μœ„ 였λ₯˜ λ‚΄μš©μ„ μ‚΄νŽ΄λ³΄λ©΄ Member ν΄λž˜μŠ€κ°€ Comparable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜μ§€ μ•Šμ•˜λ‹€κ³  λ‚˜μ˜¨λ‹€.

Comparable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜μ§€ μ•Šμ•˜λ‹€λŠ” μ˜λ―ΈλŠ” μš°λ¦¬κ°€ λ§Œλ“  Member 클래슀λ₯Ό TreeSet의 μš”μ†Œλ‘œ μΆ”κ°€ν•  λ•Œ μ–΄λ–€ κΈ°μ€€μœΌλ‘œ λ…Έλ“œλ₯Ό λΉ„κ΅ν•˜μ—¬ 트리λ₯Ό ν˜•μ„±ν•΄μ•Ό ν•˜λŠ”μ§€λ₯Ό κ΅¬ν˜„ν•˜μ§€ μ•Šμ•˜λ‹€λŠ” λœ»μ΄λ‹€.

λ”°λΌμ„œ νšŒμ›μ„ TreeSet에 μΆ”κ°€ν•  λ•Œ μ–΄λ–€ κΈ°μ€€μœΌλ‘œ 비ꡐ할 것인지λ₯Ό κ΅¬ν˜„ν•΄ μ£Όμ–΄μ•Ό ν•œλ‹€.

λ°˜μ‘ν˜•