본문 바로가기
수업(국비지원)/Java

[Java] chap13 : 컬렉션 프레임워크 - Collection(Set, LinkedHashSet, TreeSet)

by byeolsub 2023. 4. 17.
  • 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);
	}
}