[Day25] Java 25 [9/14]
PriorityQueue
PriorityQueue ์ปฌ๋ ์ ํด๋์ค
ใด FIFO X , ์ ์ฅ์์์ ์๊ด์์ด Priority(์ฐ์ ๊ถ) ๋์ ์์๊ฐ ๋จผ์ ๋์จ๋ค.
// <๊ธฐ๋ณธํ X, ์ฐธ์กฐํ O> ์ ๋ค๋ฆญ
// Queue<int> q = new PriorityQueue<int>();
Queue<Integer> q = new PriorityQueue<Integer>();
// ์ ์์ธ ๊ฒฝ์ฐ์๋ ๋ฎ์ ์ ์๊ฐ ์ฐ์ ์์๊ฐ ๋๊ตฌ๋..(ํ์ธ)
q.offer(3); // int -> Integer ์คํ ๋ฐ์ฑ
q.offer(5);
q.offer(2);
q.offer(4);
q.offer(1);
// ํ FIFO
while ( ! q.isEmpty() ) {
int n = q.poll();
System.out.println( n ); // 1,2,3,4,5
} //
Deque( [D]ouble-[E]nded [Que]ue ) FIFO ๋ํ, ๋ฑ
์์ชฝ ๋์์ ๋ชจ๋ ์ถ๊ฐ/์ถ์ถ์ด ๊ฐ๋ฅํ ์ปฌ๋ ์ ํด๋์ค
LinkedList , ArrayDeque ์ปฌ๋ ์ ํด๋์ค
↑ ↓ offer() offerFirst() pollFirst()
| |
| |
| |
| |
↑ ↓ poll() pollLast() offerLast()
public static void main(String[] args) {
Deque<String> dq = new LinkedList<String>();
} // main
Iterator, ListIterator, Enumeration ์ธํฐํ์ด์ค
๋ชจ๋ ์ปฌ๋ ์ ์์ ์ ์ฅ๋ ์์๋ฅผ ์ ๊ทผํ๋๋ฐ ์ฌ์ฉ๋๋ ์ธํฐํ์ด์ค
Enumeration(๊ตฌ๋ฒ์ ผ) Iterator(์ ๋ฒ์ ผ) < ListIterator ๊ธฐ๋ฅํ์ฅ
fail-fast ๊ธฐ๋ฅ
Vector<String> v = new Vector<>();
v.add("A"); v.add("B"); v.add("C"); v.add("D"); v.add("E");
// ์ด๊ฑฐ์
// Iterator -> ๋จ๋ฐฉํฅ ์์ ์ ๊ทผ
// ListIterator -> <- ์๋ฐฉํฅ ์์ ์ ๊ทผ
ListIterator<String> ir = v.listIterator();
while (ir.hasNext()) {
String str = ir.next();
System.out.println( str );
}
while (ir.hasPrevious() ) { // ์ด์ ์์ ์๋?
String str = ir.previous();
System.out.println( str );
}
Arrays ๋ฉ์๋
1) copyOf(), copyOfRange() - ๋ฐฐ์ด ๋ณต์ฌ
2) fill(), setAll() - ๋ฐฐ์ด ์ฑ์ฐ๊ธฐ
3) sort(), binarySearch() - ์ ๋ ฌ ๊ณผ ๊ฒ์
4) equals(), toString() ๋ฐฐ์ด ๋น๊ต, ์ถ๋ ฅ
5) asList() - ๋ฐฐ์ด -> List ์ปฌ๋ ์ ํด๋์ค ๋ณํ
6) parallelXXX() , Spliterator() , stream()
- ์ฒ๋ฆฌ ์๋(์ฑ๋ฅ)์ ์ํด์
- ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ฒ๋ฆฌํ๋ ๋ฉ์๋
Comparator ์ธํฐํ์ด์ค์ Comparable
- ๋ฐฐ์ด ์ฑ์ฐ๊ธฐ
Arrays.setAll(m, (x) -> (int)(Math.random()*101) );
System.out.println( Arrays.toString(m) );
Arrays.sort(m); // ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
System.out.println( Arrays.toString(m) );
- ์ ๋ ฌ
// ์ค๋ฆ์ฐจ์(asc) ์ ๋ ฌ
Arrays.sort( m );
// ๋ด๋ฆผ์ฐจ์( desc ) ์ ๋ ฌ + Comparator ์ง์ ๊ตฌํ , ๋ฌด๋ช
ํด๋์ค, ๋๋ค์
Arrays.sort(m, new DesendingComparator());
// ๋์๋ฌธ์ ๊ตฌ๋ถํ์ง ์๊ณ ์ ๋ ฌ( ๊ธฐ์ต )
Arrays.sort(m, String.CASE_INSENSITIVE_ORDER );
System.out.println( Arrays.toString(m) );
Comparator ์ธํฐํ์ด์ค
ํด๋์ค ์์ฒด์์ implements Comparable ํด์ @Override
public class Ex06_02 {
public static void main(String[] args) {
// 12:05 ์์
์์~
Person [] m = {
new Person("๋ฌธํ๋น", 23),
new Person("๊น๊ฒฝ์ฐ", 27),
new Person("์กฐ๋ฏผ๊ฒฝ", 25)
};
System.out.println( Arrays.toString( m ) );
// ์ ๋ ฌ
// java.lang.ClassCastException: [days25.Person] cannot be cast to java.lang.[Comparable]
// Person ํด๋์ค๋ Comparable์ธํฐํ์ด์ค๋ฅผ ๊ตฌํ ํ์ง ์์๊ธฐ ๋๋ฌธ์ ํ๋ณํ X -> ์ ๋ ฌ( ๋น๊ต X )
// Person ํด๋์ค ๋ฌด์์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ ์ ํด์ ธ ์์ง ์๋ค.
/*
Arrays.sort( m , new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.age - o2.age;
// return o1.name.compareTo( o2.name );
}
});
*/
// Arrays.sort( m , ( o1, o2) -> o1.name.compareTo( o2.name ) );
Arrays.sort( m ); // ์ด๋ฆ, ๋์ด ์ ๋ ฌ
System.out.println( Arrays.toString( m ) );
} // main
} // class
class Person implements Comparable<Person>{
// ํ๋
String rrn; // ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ
String name;
int age;
// ์์ฑ์
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person(String rrn, String name, int age) {
super();
this.rrn = rrn;
this.name = name;
this.age = age;
}
//
@Override
public String toString() {
return "Person [rrn=" + rrn + ", name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Person o) {
return this.name.compareTo(o.name);
}
// Student hashCode() , equals() ์ค๋ฒ๋ผ์ด๋ฉ~
// HashSet ์ถ๊ฐํ ๋ ํ๋ฒ ๊ฐ์ผ๋ฉด ์ถ๊ฐ๋์ง ์๋๋ก ๊ตฌํํ์ธ์.
//
@Override
public int hashCode() {
return this.rrn.hashCode();
}
@Override
public boolean equals(Object obj) {
if( obj instanceof Person) {
Person p = (Person)obj;
return this.rrn.equals(p.rrn); // true, false
}
return false;
}
} // class
HashSet ์ปฌ๋ ์ ํด๋์ค
ใด Set ๊ตฌํํ ๋ํ์ ์ธ ์ปฌ๋ ์ ํด๋์ค
ใด ์์ ์ ์ง X, ์ค๋ณต ํ์ฉ X
HashSet<Integer> hs = new HashSet<>();
// Collecion <? extends Integer> c ๋งค๊ฐ๋ณ์
hs.add( 3 );
hs.add( 5 );
hs.add( 2 );
hs.add( 4 );
hs.add( 1 );
// ๋ฉ์๋ 3๊ฐ์ง - 1)๊ธฐ๋ฅ 2) ๋งค๊ฐ๋ณ์ 3)๋ฆฌํด๊ฐ(๋ฆฌํด์๋ฃํ)
System.out.println( hs.add( 1 ) ); // ์ค๋ณต ํ์ฉ X false
hs.remove(5); // Object o, int index X
ํ์ฉ (์ค์ : HashSet -> LinkedList ๋ณํ, ์ ๋ ฌํ๊ธฐ ์ํด)
public static void main(String[] args) {
HashSet<Integer> lotto = new HashSet<Integer>();
fillLotto( lotto );
dispLotto( lotto );
} // main
public static void fillLotto( HashSet<Integer> lotto) {
Random rnd = new Random();
while( lotto.size() < 6) {
int temp = rnd.nextInt(45) + 1;
lotto.add( temp );
} // while
}
public static void dispLotto(HashSet<Integer> lotto) {
// ์ปฌ๋ ์
๊ฐ์ฒด -> [] ๋ฐฐ์ด๋ก ๋ณํ : toArray()
// Object [] = lotto.toArray();
/*
List<Integer> list = new LinkedList<>(lotto); // ์๊ธฐ( ์ํ )
Collections.sort(list);
*/
Iterator<Integer> ir = lotto.iterator();
// Iterator<Integer> ir = list.iterator();
while (ir.hasNext()) {
int n = ir.next(); // ์คํ ์ธ๋ฐ์ฑ ( Integer -> int ํ๋ณํ)
System.out.printf("[%d]", n);
}
System.out.println();
} // dispLotto
LinkedHashSet
LinkedHashSet<Integer> lotto = new LinkedHashSet<>();
lotto.add(19);
lotto.add(7);
lotto.add(27);
System.out.println( lotto ); //์์์ ์ง
// ๋ก๋๊ฒ์ : 3๋ฒ
int gameNumber = 1;
Scanner scanner = new Scanner(System.in);
System.out.print("> ๋ก๋ ๊ฒ์ ํ์ ์
๋ ฅ ? ");
gameNumber = scanner.nextInt();
// int [][] lottos = new int[gameNumber][6];
// LinkedHashSet<Integer> [] lottos = new LinkedHashSet[gameNumber];
ArrayList< LinkedHashSet<Integer> > lottos = new ArrayList<LinkedHashSet<Integer>>();
// [ ๋ฐฐ์ด์ ๋ฐฐ์ด = ๋ค์ฐจ์ ]
// ๋ก๋ ์ฑ์๋ฃ๊ณ .
for (int i = 0; i < gameNumber ; i++) { // == gameNumber
LinkedHashSet<Integer> lotto = new LinkedHashSet<Integer>();
Ex07_02.fillLotto(lotto);
lottos.add(lotto);
}
// ๋ก๋ ์ถ๋ ฅ
Iterator<LinkedHashSet<Integer>> ir = lottos.iterator();
while (ir.hasNext()) {
LinkedHashSet<Integer> lotto = ir.next();
Ex07_02.dispLotto(lotto);
}
* ArrayList์์ LinkedHashSet ๋ฃ์ ์ ์์!!
HashSet<Person> hs = new HashSet<Person>();
// ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ๊ฐ ๊ฐ๋ค๋ฉด ๋์ผํ ์ฌ๋( Person) ์ด๋ค.
Person p1 = new Person( "1111", "ํ๊ธธ๋", 20 );
Person p2 = new Person( "1111", "ํ๊ธธ๋", 20 );
System.out.println( p1.hashCode() ); // 366712642
System.out.println( p2.hashCode() ); // 1829164700
System.out.println( p1.equals(p2) ); // false
// ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ๊ฐ ๊ฐ์ Person์ hs ์ ์ค๋ณต์ฒดํฌ์ ๊ฑธ๋ ค์ ์ถ๊ฐ๋์ง ์๋๋ก ํ๊ณ ์ถ๋ค.
// ๋ฐฉ๋ฒ ? Object.hashCode(), equals() ๋ฉ์๋ ๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ.
hs.add( p1 );
hs.add( p2 );
System.out.println( hs ); // [Person [rrn=1111, name=ํ๊ธธ๋, age=20]]
์์ ) ๋น๊ณ ํ ์์ 25๊ฐ์ ์ซ์ ์ค๋ณต์ด ๋์ง ์๊ฒ ๋ฃ๊ณ ๋ค์ 2์ฐจ์ ๋ฐฐ์ด๋ก ์ฑ์๋ฃ๊ธฐ ์ํด LinkedHashSet ์ฌ์ฉ
int [][] board = new int[5][5]; //
// 1~25 ์ซ์๋ฅผ ์ค๋ณด๋์ง ์๊ฒ ์์๋ก ๋ค ์ฑ์ ๋ฃ์ด์ผ ๋๋ค์.
Random rnd = new Random();
// ์ ? LinkedHashSet ์ปฌ๋ ์
ํด๋์ค ์ฌ์ฉ
LinkedHashSet<Integer> hs = new LinkedHashSet<Integer>();
// 3:06 ์์
์์
while( hs.size() < 25 ) {
hs.add( rnd.nextInt(25) +1 ); // 1~25
} // while
// ์ถ๋ ฅ.
// [25, 23, 2, 16, 22, 21, 6, 20, 7, 12, 15, 10, 1, 3, 13, 18, 14, 9, 24, 5, 11, 8, 4, 19, 17]
System.out.println( hs );
// hs -> [][] board
Iterator<Integer> ir = hs.iterator();
// [] -> [][]
int i = 0;
while (ir.hasNext()) {
int n = ir.next();
board[i/5][i%5] = n;
i++;
}
์ค๋ณต์ฒดํฌ ( HashSet์ new ์ฐ์ฐ์๋ก ์๋ก ๋ค๋ฅธ ์ธ์คํด์ค ์ ์ฅํ๋ฉด ๋ค๋ฅธ ๊ฐ์ฒด๋ก ์ธ์, ๋ง์ฝ ๊ฐ์ฒด์ ๋ด์ฉ์ด ๋์ผํ ๊ฒ์ผ๋ก ์ทจ๊ธํ๊ธฐ ์ํด์ Person ๊ฐ์ฒด ๋ด์์ equals ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํด์ค์ผํจ
// ์ค๋ณต ์ฒดํฌ ๋ฐฉ๋ฒ ?
HashSet<Person> hs = new HashSet<Person>();
// ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ๊ฐ ๊ฐ๋ค๋ฉด ๋์ผํ ์ฌ๋( Person) ์ด๋ค.
Person p1 = new Person( "1111", "ํ๊ธธ๋", 20 );
Person p2 = new Person( "1111", "ํ๊ธธ๋", 20 );
System.out.println( p1.hashCode() ); // 366712642
System.out.println( p2.hashCode() ); // 1829164700
System.out.println( p1.equals(p2) ); // false
// ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ๊ฐ ๊ฐ์ Person์ hs ์ ์ค๋ณต์ฒดํฌ์ ๊ฑธ๋ ค์ ์ถ๊ฐ๋์ง ์๋๋ก ํ๊ณ ์ถ๋ค.
// ๋ฐฉ๋ฒ ? Object.hashCode(), equals() ๋ฉ์๋ ๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ.
hs.add( p1 );
hs.add( p2 );
System.out.println( hs ); // [Person [rrn=1111, name=ํ๊ธธ๋, age=20]]
Person๊ฐ์ฒด
@Override
public int hashCode() {
return this.rrn.hashCode();
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Person) {
Person p = (Person)obj;
return this.rrn.equals(p.rrn);
}
return false;
}
ํฉ์งํฉ / ๊ต์งํฉ / ์ฐจ์งํฉ
HashSet<Integer> a = new HashSet<Integer>();
a.add(1);a.add(2);a.add(3);a.add(4);a.add(5);
HashSet<Integer> b = new HashSet<Integer>();
b.add(4);b.add(5);b.add(6);b.add(7);b.add(8);
// 1. ํฉ์งํฉ a U b [1, 2, 3, 4, 5, 6, 7, 8]
HashSet<Integer> hab = new HashSet<Integer>();
/*
Iterator<Integer> ir = a.iterator();
while (ir.hasNext()) {
Integer n = (Integer) ir.next();
hab.add(n);
}
ir = b.iterator();
while (ir.hasNext()) {
Integer n = (Integer) ir.next();
hab.add(n);
}
*/
hab.addAll(a);
hab.addAll(b);
// 2. ๊ต์งํฉ a ∩ b [4, 5]
HashSet<Integer> kyo = new HashSet<Integer>();
Iterator<Integer> ir = a.iterator();
while (ir.hasNext()) {
Integer n = (Integer) ir.next();
if( b.contains( n )) { // ๊ต์งํฉ
kyo.add(n);
} else{ // ์ฐจ์งํฉ
//cha.add(n);
}
} // while
// 3. ์ฐจ์งํฉ a - b [1,2,3]
HashSet<Integer> cha = new HashSet<Integer>( a ); // [1, 2, 3, 4, 5]
// cha.addAll(a);
cha.removeAll(kyo);
TreeSet
[TreeSet ํน์ง]
1) ์ด์ง ๊ฒ์ ํธ๋ฆฌ (binarySearch Tree) -> ๋ฐ์ดํฐ ์ ์ฅ
๊ฒ์ ์ฑ๋ฅ ๋ฐ์ด๋๋ค.
2) Set = ์ค๋ณต ํ์ฉ X, ์์ ์ ์ง X
3) ๊ฒ์ + ์ ๋ ฌ + ๋ฒ์ ๊ฒ์ ์ฑ๋ฅ ๋ฐ์ด๋๋ค.
4) ๋งํฌ๋๋ฆฌ์คํธ ์ฒ๋ผ ๋ ธ๋(Node)๊ฐ ์ฐ๊ฒฐ๋ ๊ตฌ์กฐ.
next ๋ค์ ์์ ์ฃผ์
Prev ์ด์ ์์ ์ฃผ์
5) ์ต์์ ๋ ธ๋๋ฅผ "root" ๋ ธ๋
๋ถ๋ชจ-์์ ๋ ธ๋ ๊ด๊ณ,
ํ์ ๋ ธ๋ ๊ด๊ณ
6) class TreeNode{
TreeNode ์ผ์ชฝ ์์๋ ธ๋;
TreeNode ์ค๋ฅธ์ชฝ ์์๋ ธ๋;
Object value;
}
TreeSet<Integer> ts = new TreeSet<Integer>();
ts.add( 7 );
ts.add( 4 );
ts.add( 9 );
ts.add( 1 );
ts.add( 5 );
ts.add( 6 );
System.out.println( ts ); //[1, 4, 5, 6, 7, 9]
System.out.println( ts.first() ); // ์ ๋ ฌ๋ ์์์์ ์ฒซ ๋ฒ์งธ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. 1
System.out.println( ts.last() ); // ์ ๋ ฌ๋ ์์์์ ๋ง์ง๋ง ๋ฒ์งธ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. 9
SortedSet<Integer> ss = ts.subSet(1, 7);
System.out.println( ss ); //[1, 4, 5, 6]
// ์ง์ ๋ ๊ฐ์ฒด(1) ๋ณด๋ค ํฐ ๊ฐ์ ๊ฐ์ง ๊ฐ์ฒด ์ค์ ์ ์ผ ๊ฐ๊น์ด ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฐํ, ์์ผ๋ฉด null
System.out.println( ts.higher(1) ); // 4
// ts.lower(1) // null
// ์ง์ ๋ ๊ฐ์ฒด(3)์ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฐํ, ์์ผ๋ฉด ์์ ๊ฐ์ ๊ฐ์ง ๊ฐ์ฒด ์ค์ ์ ์ผ ๊ฐ๊น์ด ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฐํ
// ์์ผ๋ฉด null ๋ฐํ
System.out.println( ts.floor(3) ); // 1
// ์ง์ ๋ ๊ฐ์ฒด(3)์ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฐํ, ์์ผ๋ฉด ํฐ๊ฐ์ ๊ฐ์ง ๊ฐ์ฒด ์ค์ ์ ์ผ ๊ฐ๊น์ด ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฐํ
// ์์ผ๋ฉด null ๋ฐํ
System.out.println( ts.ceiling(3) ); // 4
// TreeSet์ ์ ๋ ฌ๋ ๊ตฌ์กฐ ( ๋ฐ๋ก ์ ๋ ฌ X )
์์
TreeSet<Integer> set = new TreeSet<Integer>();
int [] score = { 80, 95, 50, 35, 45, 65, 10, 100};
for (int i = 0; i < score.length; i++) {
set.add( score[i] );
}
System.out.println( set ); // ์๋ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
// headSet() : ์ง์ ๋ ๊ฐ์ฒด(50)๋ณด๋ค ์์ ๊ฐ์ ๊ฐ์ฒด๋ค์ ๋ฐํ.
SortedSet<Integer> r1 = set.headSet(50, true); // 50 ํฌํจ๋์ง ์๋๋ค.
// tailSet() : ์ง์ ๋ ๊ฐ์ฒด(50)๋ณด๋ค ํฐ ๊ฐ์ ๊ฐ์ฒด๋ค์ ๋ฐํ.
SortedSet<Integer> r1 = set.tailSet(50); // 50 ํฌํจ๋์ง ์๋๋ค.
set.headSet(50, true); // 50 ํฌํจํ๋ค.
์ต๊ทผ๋๊ธ