728x90
    
    
  반응형
    
    
    
  Set

HashSet
HashSet은 인터페이스 Set의 구현 클래스
Enhanced for문 사용 가능
랜덤 위치에 원소가 저장되므로 입력한 순서에 상관없이 원소가 출력됨
Set는 원소 중복 허용 x
Set 원소 중복
import java.util.*;
class Point {
    int x, y;
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
    @Override
    public String toString() {
        return "Point(" + x + "," + y + ")";
    }
//    @Override
//    public boolean equals(Object obj) {
//        Point p = (Point) obj;
//        if (x == p.x && y == p.y) return true;
//        else return false;
//    }
//
//    @Override
//    public int hashCode() {
//        return Objects.hash(x, y);
//    }
}
public class Main {
    public static void main(String[] args) {
        HashSet<Point> set = new HashSet<>();
        set.add(new Point(1, 2));
        set.add(new Point(1, 2));
        set.add(new Point(3, 4));
        set.add(new Point(4, 5));
        set.add(new Point(5, 6));
        System.out.println("size: " + set.size());
        for (Point p : set) System.out.println(p.toString() + '\t');
    }
}출력 결과
size: 5
Point(4,5)
Point(1,2)
Point(3,4)
Point(5,6)
Point(1,2)
Set은 원소 중복 허용 x
하지만, 객체 저장 시 객체에 저장된 값이 중복되는 경우에는 원소가 저장됨
저장된 객체가 서로 다른 객체이기 때문
따라서 위 코드의 주석 부분을 해제하여 Set에서 값이 같은 원소 중복 막을 수 있음(오버라이딩)
만약 객체가 멤버로 다른 객체를 포함한다면, 포함하는 객체까지 오버라이딩 해줘야함
TreeSet
public class TreeSet<E> extends AbsteactSet<E> implements NavigableSet<E>, Cloneable, Serializable
참고: [자료구조] 이진 탐색 트리
TreeSet = 이진 탐색 트리 + 중복 없음
TreeSet가 상속받는 인터페이스 NavigableSet
| 메소드 | 기능 | 
| add | 원소 추가 | 
| E first() | 최솟값 리턴 | 
| E last() | 최댓값 리턴 | 
| E lower(E e) | 인자보다 작은 최댓값 리턴 | 
| E higher(E e) | 인자보다 큰 최솟값 리턴 | 
| E floor(E e) | 인자보다 작거나 같은 최댓값 수 리턴 | 
| E ceiling(E e) | 인자보다 크거나 같은 최댓값 수 리턴 | 
| E poolFirst() | 최솟값 리턴, 삭제 | 
| E poolLast() | 최댓값 리턴, 삭제 | 
| Iterator<E> descendingIterator() | 내림차순 반복자 리턴 | 
| NevigableSet<E> desendingSet() | 역순 정렬된 새로운 set 리턴 | 
| NavigableSet<E> subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) | 범위가 formElement에서 toElement까지인 새로운 set 리턴 Inclusive가 true인 경우 범위에 Element까지를 포함 | 
id로 정렬하는 경우
import java.util.Set;
import java.util.TreeSet;
// Comparable 상속
class Student implements Comparable<Student> {
    private String name;
    private int id;
    public Student(String name, int id) {
        this.name = name;
        this.id = id;
    }
    @Override
    public String toString() {
        return "Student(name=" + name + ",id=" + id + ")";
    }
    
    @Override // 오버라이딩
    public int compareTo(Student s) {
        return this.id - s.id;
    }
}
public class Main {
    public static void main(String[] args) {
        Set<Student> set = new TreeSet<>();
        set.add(new Student("박", 201701));
        set.add(new Student("김", 201702));
        set.add(new Student("이", 201703));
        for (Student s : set) System.out.println(s);
    }
}TreeSet에 기본적으로 객체를 추가할 수 없음
따라서 오버라이딩 필요(주석 부분이 있어야 함)
이름으로 정렬하는 경우
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
class Student {
    private String name;
    private int id;
    public Student(String name, int id) {
        this.name = name;
        this.id = id;
    }
    String getName() {
        return name;
    }
    @Override
    public String toString() {
        return "Student(name=" + name + ",id=" + id + ")";
    }
}
// 이름에 대해서 비교할 수 있도록 함
class StudentComparator implements Comparator<Student> {
    public int compare(Student o1, Student o2) {
        return o1.getName().compareTo(o2.getName());
    }
}
public class Main {
    public static void main(String[] args) {
        // TreeSet 생성자에 비교기(Comparator)를 추가하여 해당 기준에 대해서 비교
        Set<Student> set = new TreeSet<>(new StudentComparator());
        set.add(new Student("박", 201701));
        set.add(new Student("김", 201702));
        set.add(new Student("이", 201703));
        for (Student s : set) System.out.println(s);
    }
}
728x90
    
    
  반응형
    
    
    
  '전공 > 객체지향프로그래밍' 카테고리의 다른 글
| [객체지향프로그래밍][Java] Generics 심화 내용 (0) | 2023.06.03 | 
|---|---|
| [객체지향프로그래밍][Java] Queue 심화 내용 (0) | 2023.06.01 | 
| [객체지향프로그래밍][Java] List 심화 내용(Iterator) (0) | 2023.06.01 | 
| [객체지향프로그래밍][Java] 모듈과 패키지 개념 (Object, Wrapper, Integer, String, StringBuffer, StringTokenizer, Math, Calendar) (0) | 2023.05.31 | 
| [객체지향프로그래밍][Java] 인터페이스의 구성 요소 심화 내용 (0) | 2023.05.31 |