- Set 인터페이스
Set인터페이스 : Collection 인터페이스의 하위 인터페이스.
중복 객체 저장 불가. 순서 유지 안함.
구현 클래스 : HashSet : 중복 불가, 순서 모름
TreeSet : 중복 불가, 정렬됨.
LinkedHashSet : 중복 불가, 순서 유지
📌
package chap13;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
public class SetEx1 {
public static void main(String[] args) {
Object[] arr = {"홍길동",1,"1","김삿갓","이몽룡","홍길동",
"성춘향","향단이","홍길동","김삿갓"};
// Set<Object> set1 = new HashSet<>();
// Set<Object> set2 = new HashSet<>();
// Set<Object> set3 = new HashSet<>();
Set<Object> set1 = new LinkedHashSet<>();
Set<Object> set2 = new LinkedHashSet<>();
Set<Object> set3 = new LinkedHashSet<>();
for(Object o : arr) {
//boolean add(Object) : Set 요소 추가
// true/false 값리턴
// 결과 true : Set 에 요소 추가 성공
// 결과 false : Set 에 요소 추가 실패
if(!set1.add(o)) { //set1 객체에 요소 추가 실패한 경우
if(!set2.add(o)) {
set3.add(o);
}
}
}
System.out.println(set1);
System.out.println(set2);
System.out.println(set3);
//개선된 for 구문으로 요소 출력하기
// set1.get(0); //get 멤버 메서드 없음. 인덱스로 객체 리턴 불가
for (Object o : set1)
System.out.print(o + ",");
System.out.println();
for (Object o : set2)
System.out.print(o + ",");
System.out.println();
for (Object o : set3)
System.out.print(o + ",");
System.out.println();
}
}
- Set 객체에서 중복 판단 관련 메서드
Set 객체에서 중복 판단 관련 메서드
1. boolean equals() : 결과가 true
2. int hashCode() : 결과의 값이 같다
=> 두개 모두 만족하는 객체는 중복 판단함.
사용자가 정의한 클래스의 객체의 중복판단하기 위해서는 equals, hashCode 메서드를 오버라이딩 필요.
📌
package chap13;
import java.util.HashSet;
import java.util.Set;
//Person 객체의 내용이 같으면 중복으로 인정되도록 프로그램 수정
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age =age;
}
public String toString() {
return "(" + name+"," + age+")";
}
//equals, hashCode 메서드 오버라이딩 : 논리적으로 같은 객체임을 판단.
@Override
public int hashCode() {
return name.hashCode()+age;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Person) {
Person p = (Person)obj;
return name.equals(p.name) && age == p.age;
}
return false;
}
}
public class SetEx2 {
public static void main(String[] args) {
Set<Object> set = new HashSet<>();
set.add(new String("abc"));
set.add(new String("abc")); //추가 실패
set.add(new Person("홍길동",10));
set.add(new Person("홍길동",10));
System.out.println(set);
System.out.println(set.size()); //2. set 객체의 요소의 갯수
}
}
📌 Collection(Set) Exam2.
package chap13;
import java.util.HashSet;
import java.util.Set;
/*
* Student 클래스 구현하기
* 1. 멤버 변수 : 학번(studno),이름(name),전공(major)
* 2. 멤버메서드: 학생 정보를 출력하도록 toString 오버라이딩 하기
* 3. 학번과 이름이 같은 경우 같은 학생으로 인식하도록하기.
* => 학번과 이름이 같은 경우 중복된 학생으로 인식
* 4. 구동클래스에 맞도록 생성자 구현.
*/
class Student {
String studno,name,major;
Student (String studno,String name,String major) {
this.studno = studno;
this.name = name;
this.major = major;
}
@Override
public int hashCode() {
return studno.hashCode() + name.hashCode();
}
@Override
public boolean equals(Object o) {
if(o instanceof Student) {
Student s = (Student)o;
return studno.equals(s.studno) && name.equals(s.name);
} else
return false;
}
@Override
public String toString() {
return "학번:"+studno+", 이름:"+name+", 전공:"+major;
}
}
public class Exam2 {
public static void main(String[] args) {
Set<Student> set = new HashSet<>();
set.add(new Student("1234","홍길동","경영"));
set.add(new Student("2345","홍길순","경영"));
set.add(new Student("2345","홍길순","컴공"));//x
set.add(new Student("1234","홍길동","통계"));//x
set.add(new Student("4567","홍길동","경영"));
System.out.println("등록 학생 수:" + set.size()); //3
System.out.println("등록학생:");
for(Student s : set) System.out.println(s);//3명출력
}
}
- LinkedHashSet
LinkedHashSet : Set 구현 클래스(List 의 구현 클래스는 아님)
중복 불가, 순서유지
인덱스(첨자) 사용 불가
📌
package chap13;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
public class SetEx3 {
public static void main(String[] args) {
Set<Integer> set = new LinkedHashSet<>();
// Set<Integer> set = new HashSet<>();
for(int i=0;i<10;i++) {
int num = (int)(Math.random()*10); //0~9사이의 임의의 수
System.out.println("임의의 수:"+num);
set.add(num); //set에 추가
}
System.out.println(set);
//개선된 for 구문을 이용하여 출력하기 - 인덱스(첨자) 사용가능
//개선된 for 구문 : 배열, Collection 객체
for(Integer i : set) {
System.out.println(i);
}
//index(첨자)를 이용하여 객체 조회 => Set 객체는 인덱스 사용 불가.
//List 객체 <= Set 객체
List<Integer> list = new ArrayList<>(set);
for(int i=0;i<list.size();i++) {
System.out.print(list.get(i)+",");
}
System.out.println();
}
}
- TreeSet
TreeSet : 중복 불가, 정렬됨.
Exam3.java 소스를 TreeSet으로 수정하기
Comparable 인터페이스 : TreeSet의 요소는 구현클래스여야함.
Comparator 인터페이스 : 실행 중(동적으로) 정렬방식을 설정 가능
📌
package chap13;
import java.util.Random;
import java.util.Set;
import java.util.TreeSet;
public class SetEx4 {
public static void main(String[] args) {
Set<Integer> set = new TreeSet<>();
Random r = new Random();
r.setSeed(System.currentTimeMillis());
while(set.size() < 6) {
set.add(r.nextInt(45)+1);
}
System.out.println(set);
/* 내림차순으로 출력
Set<Integer> set = new TreeSet<>((i1,i2)->i2.compareTo(i1)); //Comparator 인터페이스
Random r = new Random();
r.setSeed(System.currentTimeMillis());
while(set.size() < 6) {
set.add(r.nextInt(45)+1);
}
System.out.println(set);
*/
}
}
📌 Collection(Set) Exam3.
package chap13;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/*
* 1~45사이의 중복되지 않은 숫자 6개를 정렬하여 출력하기
*/
public class Exam3 {
public static void main(String[] args) {
Set<Integer> set = new HashSet<>();
while(set.size() <6) {
int num = (int)(Math.random()*45)+1;
set.add(num);
}
System.out.println(set);
//List 객체 <= Set 객체
List<Integer> list = new ArrayList<>(set);
Collections.sort(list);
System.out.println(list);
}
}
'수업(국비지원) > Java' 카테고리의 다른 글
[Java] chap13 : 컬렉션 프레임워크 - EastCard 게임 프로그램 구현 (0) | 2023.04.17 |
---|---|
[Java] chap13 : 컬렉션 프레임워크 - Collection(Map, TreeMap) (0) | 2023.04.17 |
[Java] chap13 : 컬렉션 프레임워크 - Collection(List) (0) | 2023.04.17 |
[Java] chap12: 기본 API - 기본 API Exam3. (0) | 2023.04.16 |
[Java] chap12: 기본 API - Calendar (0) | 2023.04.16 |