HashSet
- ์์๋ฅผ ๋ณด์ฅํ์ง ์์ผ๋ฉฐ ์ค๋ณต ๊ฐ์ ํ์ฉํ์ง ์์ต๋๋ค.
- ์ค๋ณต ์ฌ๋ถ ํ์ธ์ HashCode()์ ๋ฆฌํด ๊ฐ์ ์ด์ฉ ํฉ๋๋ค. (๊ฒฝ์ฐ์ ๋ฐ๋ผ์ ์ค๋ฒ๋ผ์ด๋ฉ)
- ์ํ์ ์งํฉ๊ณผ ์ ์ฌํ ๊ฐ๋ (ํฉ์งํฉ, ๊ต์งํฉ, ์ฐจ์งํฉ)
import java.util.Arrays;
import java.util.HashSet;
public class Main {
public static void main(String[] args) {
HashSet<Member> set = new HashSet<>();
set.add(new Member(1000, "์์ฝฉ๋ฏธ"));
set.add(new Member(1001, "๊ฐ๋ฏผ๊ฒฝ"));
set.add(new Member(1002, "ํ๊ธธ๋"));
Member member = new Member(1003, "ํ๋ผ๋ด");
set.add(member);
set.add(new Member(1002, "๊น๋ธ๊ธฐ"));
for(Member e : set) {
e.showMember();
}
}
}
id : 1000
์ด๋ฆ : ์์ฝฉ๋ฏธ
---------------
id : 1001
์ด๋ฆ : ๊ฐ๋ฏผ๊ฒฝ
---------------
id : 1002
์ด๋ฆ : ํ๊ธธ๋
---------------
id : 1003
์ด๋ฆ : ํ๋ผ๋ด
---------------
id : 1002
์ด๋ฆ : ๊น๋ธ๊ธฐ
---------------
๐ธ : ํน์ ์ด ์ฝ๋์์ ์ด์ํ ์ ๋ชป ๋๊ผ๋?
๐ถ : ๋ฐฉ๊ธ Set ํด๋์ค๋ ์ค๋ณต์ ํ์ฉํ์ง ์๋๋ค ํ๋๋ฐ id 1002๊ฐ ์ค๋ณต์ธ๋ฐ๋ ๋ถ๊ตฌํ๊ณ ๋ ๋ค ์ถ๋ ฅ๋์ด. ์ด๋ป๊ฒ ๋๊ฑฐ์ง?
๐ธ : ๊ฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์ฐธ์กฐ ๋ณ์ 'set'์ด ๊ฐ๋ฆฌํค๋ ์ฃผ์๊ฐ ๊ฐ๊ธฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ hashCode()๋ ๋ค๋ฅด๊ฒ ๋ฆฌํด๋๊ธฐ ๋๋ฌธ์ด์ผ.
Set ํด๋์ค๋ ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด hashCode() ๋ฆฌํด๊ฐ์ด ๊ฐ๊ณ , equals() ๋ฆฌํด๊ฐ true๋ฉด ๋๋ฑ ๊ฐ์ฒด๋ก ๋ด. ๋ฐ๋ผ์ hashCode()์ equals()๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ์ฌ ์ฝ๋๋ฅผ ์์ ํ๋ฉด ์ด๋ฌํ ์ค๋ฅ(?)๋ฅผ ์์จ ์ ์์ด.
๐ถ : ๋ญ ๋ง์ธ์ง ์ดํด๊ฐ ์ด๋ ค์ ๊ฐ๊ตด
๐ธ : ๊ทธ๋ฆผ์ผ๋ก ๋ค์ ์ค๋ช ํด์ค๊ฒ.
๐ธ : ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋๋ง๋ค ํด๋น ๋ฐ์ดํฐ๋ Heap ๋ฉ๋ชจ๋ฆฌ์ '๊ฐ'์ด ์๋ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ๋ด๊ธด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด. ์ด ์ฃผ์๊ฐ์ ํ ๋๋ก hashFunction์์ hashCode๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ค์ id๊ฐ ๊ฐ๋ ์๋๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ์ธ์ํ๋๊ฑฐ์ง.
์ด๊ฑธ ์๋์ ๊ฐ์ ์ฝ๋๋ก hashCode()์ equals()๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ๋ฉด id๊ฐ ๊ฐ์ผ๋ฉด ๋๋ฑํ ๊ฐ์ฒด๋ก ์ธ์ํ ์ ์๋๋ก ํ์ฌ ์ค๋ณต์ ์ ๊ฑฐํ ์ ์์ด!
๐ถ : ์์ธํ ์ค๋ช ๊ณ ๋ง์ ๊ฐ๊ตด
class Member {
int id;
String name;
@Override // Object์ hashCode()๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ
public int hashCode() {
return id;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Member) { // ๋ชจ๋ ํด๋์ค ์ค Member ํด๋์ค ํ์
์ด๋ฉด true
Member member = (Member) obj; // ๋ถ๋ชจ ๊ฐ์ฒด์์ ์์ ๊ฐ์ฒด๋ก ๋ณํํ๊ธฐ ๋๋ฌธ์ ๋ค์ด์บ์คํ
์ฌ์ฉ
if(this.id == member.id) return true;
} else return false;
return false;
}
public Member(int id, String name) {
this.id = id;
this.name = name;
}
public void showMember() {
System.out.println("id : " + id);
System.out.println("์ด๋ฆ : " + name);
System.out.println("---------------");
}
}
main์์ ๋ค์ ์คํํ๋ฉด
id : 1000
์ด๋ฆ : ์์ฝฉ๋ฏธ
---------------
id : 1001
์ด๋ฆ : ๊ฐ๋ฏผ๊ฒฝ
---------------
id : 1002
์ด๋ฆ : ํ๊ธธ๋
---------------
id : 1003
์ด๋ฆ : ํ๋ผ๋ด
---------------
๊ต์งํฉ, ํฉ์งํฉ, ์ฐจ์งํฉ ๊ตฌํ๊ธฐ
๊ต์งํฉ
public static void main(String[] args) {
HashSet<Integer> s1 = new HashSet<>(Arrays.asList(1,2,3,4,5,6));
HashSet<Integer> s2 = new HashSet<>(Arrays.asList(4,5,6,7,8,9));
s1.retainAll(s2); // ๊ต์งํฉ์ ์ํํ๋ ๋ฉ์๋
System.out.println(s1);
}
ํฉ์งํฉ
public static void main(String[] args) {
HashSet<Integer> s1 = new HashSet<>(Arrays.asList(1,2,3,4,5,6));
HashSet<Integer> s2 = new HashSet<>(Arrays.asList(4,5,6,7,8,9));
s1.addAll(s2); // ํฉ์งํฉ์ ์ํ
System.out.println(s1);
}
์ฐจ์งํฉ
public static void main(String[] args) {
HashSet<Integer> s1 = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6));
HashSet<Integer> s2 = new HashSet<>(Arrays.asList(4, 5, 6, 7, 8, 9));
HashSet<Integer> substract = new HashSet<>(s1); // s1์ผ๋ก substract ์์ฑ
substract.removeAll(s2); // ์ฐจ์งํฉ ์ํ
System.out.println(substract); // [1, 2, 3] ์ถ๋ ฅ
}
๊ด๋ จ ๋ฉ์๋
๊ฐ ์ถ๊ฐํ๊ธฐ(add)
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
set.add("Jump");
set.add("To");
set.add("Java");
System.out.println(set); // [Java, To, Jump] ์ถ๋ ฅ
}
๊ฐ ์ฌ๋ฌ ๊ฐ ์ถ๊ฐํ๊ธฐ(addAll)
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
set.add("Jump");
set.addAll(Arrays.asList("To", "Java"));
System.out.println(set); // [Java, To, Jump] ์ถ๋ ฅ
}
ํน์ ๊ฐ ์ ๊ฑฐํ๊ธฐ(remove)
public static void main(String[] args) {
HashSet<String> set = new HashSet<>(Arrays.asList("Jump", "To", "Java"));
set.remove("To");
System.out.println(set); // [Java, Jump] ์ถ๋ ฅ
}
โ๏ธ์๊ณ ๋ฆฌ์ฆ ์์ ๐ธ
๋ฌธ์ : ์ํ๋ฒณ ์๋ฌธ์๋ก ์ด๋ฃจ์ด์ง N๊ฐ์ ๋จ์ด๊ฐ ๋ค์ด์ค๋ฉด ์๋์ ๊ฐ์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ ๋ ฌํ๋ ํ๋ก๊ทธ๋จ ์์ฑ
์กฐ๊ฑด 1. ๊ธธ์ด๊ฐ ์งง์ ๊ฒ ๋ถํฐ
์กฐ๊ฑด 2. ๊ธธ์ด๊ฐ ๊ฐ์ผ๋ฉด ์ฌ์ ์์ผ๋ก
์กฐ๊ฑด 3. ์ค๋ณต ์ ๊ฑฐ
์
๋ ฅ : 13 but i wont hesitate no more no more it cannot wait im yours
์ถ๋ ฅ : i im it no but more wait wont yours cannot hesitate
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] word = new String[n];
for(int i = 0; i < word.length; i++) {
word[i] = sc.next();
}
// โ
HashSet์ ์ด์ฉํด ์ค๋ณต ์ ๊ฑฐ ํ word ๋ฐฐ์ด์ ๋ค์ ๋ด์.
HashSet<String> hashSet = new HashSet<>(Arrays.asList(word));
word = hashSet.toArray(new String[0]); // ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ 0์ผ๋ก ์ง์ ํ๋ฉด ์๋์ผ๋ก ๋ฐฐ์ด ํฌ๊ธฐ๊ฐ ์ง์ ๋จ
Arrays.sort(word, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if(o1.length() == o2.length()) {
return o1.compareTo(o2); // ๊ฒฐ๊ณผ๊ฐ ์์์ด๋ฉด ์ ๋ ฌ ์กฐ๊ฑด (o2๊ฐ ์ฌ์ ์์ผ๋ก ๋ ์์ธ ๊ฒฝ์ฐ)
} else {
return o1.length() - o2.length(); // ๊ฒฐ๊ณผ๊ฐ ์์์ด๋ฉด ์ ๋ ฌ ์กฐ๊ฑด
}
}
});
for(String e : word) System.out.print(e + " ");
}
}