Set
주로 고유한 항목의 집합이 필요할 때 사용 (회원 ID 집합)
💡 List, Set, ,Map 처럼 Hash
자료구조를 사용하려면 정수
로된 숫자 값인 해시코드가 필요
정수 타입이 아닌 다른 타입들을 어떻게 숫자 해시코드를 제공하는 걸까?
-> 자바는 모든 객체가 자신만의 해시코드를 표현할 수 있는 기능을 제공함
-> Object
의 hashCode()
메서드
public class Object{ // 인스턴스가 다르면 해시코드가 다름
public int hashCode(); // 객체의 참조값을 기반으로 해시코드 생성 (정수 값으로 생성)
}
기본적으로 ArrayList에서 나왔던 size, isEmpty, contains, remove, add 등 메소드는 동일
// 데이터 저장한 후
// set에 저장된 데이터를 한개씩 출력하기
// 어떤 값에 대해서 지칭할 수 없기 때문에(순서가 x)
HashSet set = new HashSet();
// 데이터 저장하기
set.add("유병승");
set.add("최주영");
set.add("최솔");
set.add("이다영");
Iterator it = set.iterator(); // Iterator 인터페이스를 이용해서 출력
System.out.println("===Iterator로 출력하기===");
while(it.hasNext()) { // 다음으로 갈수있는것이 있는지 물어봄
// 기본적으로 set에서 add함수의 반환형은 object기 때문에 형변환 해줘야함
String value = (String)it.next();
System.out.println(value);
}
HashSet students = new HashSet();
// 객체를 값 으로 넣기
students.add(new Student("유병승",1,3,'남'));
students.add(new Student("최주영",3,2,'남'));
students.add(new Student("김예린",2,1,'여'));
students.add(new Student("윤나라",2,2,'여'));
// 전체 출력
students.forEach((s)->System.out.println(s));
// 여자인 사람만 뽑기
for(Object o : students) {
Student s = (Student)o;
if(s.getGender() == '여') {
System.out.println(s.getName()+" "+s.getGender());
}
}
// set과 list의 호환하기
// ArrayList 인자값 안에 HashSet 값을 넣음
ArrayList studentList = new ArrayList(students); // HashSet -> ArrayList
// 리스트로 변환 후 출력
System.out.println(studentList.get(0)); // 리스트로 변환했기 때문에 인덱스로 값 접근 가능
System.out.println(studentList.get(1));
// List.of 메소드 -> List 타입으로만 접근 가능 (ArrayList로 접근 x)
List testData = List.of(1,2,3,4,5,5,6,6,7,7,8,8,10,10); // 중복값 포함해서 만듬
HashSet hs = new HashSet(testData); // 리스트 -> HashSet으로 바뀜
ArrayList al = new ArrayList(hs); // HashSet -> 리스트로 바뀜
for(Object o : al) {
System.out.println(o); // 1,2,3,4,5,6,7,8,10
}
// addAll 메소드 -> list1.addAll(list2); -> list2의 데이터를 list1 뒤에 붙인다.
al.addAll(students);
System.out.println("students 데이터 추가 후 출력하기");
al.forEach((e)->System.out.println(e));
LinkedHashSet liset = new LinkedHashSet();
liset.add(1);
liset.add(3);
liset.add(2);
liset.add(2);
liset.add(2);
liset.add(8);
liset.add(4);
System.out.println("==linkedHashSet 출력==");
for(Object i : liset) {
System.out.println(i); // 1 3 2 8 4 출력
}
비교자(Comparator)
로 변경 가능 TreeSet studentTree = new TreeSet();
// Student 클래스에 compareTo 재정의 되어있음
// Student 클래스에서 Comparable 인터페이스를 구현하자!
studentTree.add(new Student("최주영",1,1,'남'));
studentTree.add(new Student("최주영",2,1,'남'));
studentTree.add(new Student("김현영",2,2,'여'));
studentTree.add(new Student("최하리",3,1,'여'));
System.out.println("==studentTree 출력하기==");
for(Object o : studentTree) {
System.out.println(o);
}
// student 클래스
public class Student implements Comparable{
@Override
public int compareTo(Object o ) {
return this.name.compareTo(((Student)o).name);
}
}