organize/자바

Java 25

001cloudid 2024. 5. 11. 23:00
728x90

HashSet

순서X, 중복X

 

Set

HashSet, SortedSet ← TreeSet

 

  • HashSet
    Set인터페이스를 구현한 대표적인 컬렉션 클래스
    순서를 유지하려면, LinkedHashSet클래스를 사용하면 됨
    HashSet()
    HashSet(Collection c) 생성자
    HashSet(int initialCapacity) 초기용량
    HashSet(int initialCapacity, float loadFactor) float loadFactor언제 초기 용량을 늘릴것인지
    boolean add(Object o) 
    boolean addAll(Collection c) 합집합
    boolean remove(Object o)
    boolean removeAll(Collection c) 교집합
    boolean retainAll(Collection c) 조건부 삭제(c에 있는 것만 남기고 나머지 삭제), 차집합
    void clear()
    boolean contains(Object o)
    boolean containsAll(Collection c)
    Iterator iterator()
    boolean isEmpty()
    int size()
    Object[] toArray() 객체배열로 반환
    Object[] toArray(Object[] a) 객체배열로 반환
  • TreeSet
    범위 검색(from ~ to)과 정렬에 유리한 컬렉션 클래스
    HashSet보다 데이터 추가, 삭제 시간이 더 걸림
package chapter11;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Study09Ex1 {
	
	public static void main(String[] args) {

		Object[] objArr = {"1", new Integer(1), "2","2","3","3","4","4","5","5"};
		Set set = new HashSet();		
		
		for(int i = 0; i<objArr.length;i++) {
			set.add(objArr[i]); //HashSet에 objArr 요소를 저장
		}
		
		System.out.println(set); //HashSet에 저장된 요소 출력. 순서를 보장하지 않음. [1, 1, 2, 3, 4, 5] 
		
		Iterator iterator = set.iterator();
		while (iterator.hasNext()) { //hasNext() 읽어 올 요소가 있는지 확인
			System.out.println(iterator.next()); //next() 요소 하나 꺼내오기
		}
		
	}

}

 

package chapter11;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Study09Ex1 {
	
	public static void main(String[] args) {

		Object[] objArr = {"1", new Integer(1), "2","2","3","3","4","4","5","5"};
		Set set = new HashSet();		
		
		for(int i = 0; i<objArr.length;i++) {
//			set.add(objArr[i]); //HashSet에 objArr 요소를 저장
			System.out.println(objArr[i]+" = " + set.add(objArr[i])); //중복된 요소는 false로 허용하지 않음
		}
		
		System.out.println(set); //HashSet에 저장된 요소 출력. 순서를 보장하지 않음. [1, 1, 2, 3, 4, 5] 
		
		Iterator iterator = set.iterator();
		while (iterator.hasNext()) { //hasNext() 읽어 올 요소가 있는지 확인
			System.out.println(iterator.next()); //next() 요소 하나 꺼내오기
		}
		
	}

}

 

package chapter11;

import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

public class Study09Ex2 {
	
	public static void main(String[] args) {

		Set set = new HashSet();
 		
		for(int i = 0; set.size() < 6; i++) {
			//set의 크기가 6보다 작은 동안 1 ~ 45 사이의 난수를 저장
			int num = (int)(Math.random()*45)+1;
			set.add(new Integer(num));
		}
		
		List list = new LinkedList(set); //set의 모든 요소를 List에 저장
		Collections.sort(list); //list 정렬
		System.out.println(list);
		
	}

}

 

HashSet은 객체를 저장하기 전 기존에 같은 객체가 있는지 확인

같은 객체가 없으면 저장하고, 있으면 저장하지 않음

boolean add(Object o)는 저장할 객체의 equals()와 hashCode()를 호출

equals()와 hashCode()가 오버라이딩 되어 있어야함

		 class Person{
		 String name;
		 int age;
		 
		 Person(String name, int age){
		 	this.name = name;
		 	this.age = age;
		 }
		 
		 	public String toString(){
		 		return name +" = " + age;
		 	}	
		 }
		 
		 public boolean equals(Object obj){
		 	if(!(obj instanceof Person return false;
		 
			Person tmp = (Person)obj;
		 	return name.equals(tmp.name) && age == tmp.age; 
		 }
		 
		 public int hashCode(){
//		 	return (name+age).hashCode();
		 	return Objects.hash(name, age); //최신방식
		 }

 

package chapter11;

import java.util.HashSet;
import java.util.Objects;

class Person{
	String name;
	int age;
	
	Person(String name, int age){
		this.name = name;
		this.age = age;
	}
	
	public String toString() {
		return name +" "+ age;
	}

	@Override
	public int hashCode() {
		//int hash(Object ... values); //가변인자
		return Objects.hash(age, name);
	}

	@Override
	public boolean equals(Object obj) {
		if(!(obj instanceof Person)) return false;
		Person p = (Person)obj;
		//this의 이름과 나이를 p와 비교
		return this.name.equals(p.name) && this.age==p.age;
	}
	
}

public class Study09Ex3 {

	public static void main(String[] args) {
		
		HashSet set = new HashSet();
		
		set.add("홍길동");
		set.add("홍길동"); //중복이기 때문에 저장 안됨
		set.add(new Person("김아무개", 10));
		set.add(new Person("김아무개", 10)); //중복이기 때문에 저장 안됨
		
		System.out.println(set); //[김아무개 10, 홍길동]

	}

}

 

package chapter11;

import java.util.HashSet;
import java.util.Iterator;

public class Study09Ex4 {

	public static void main(String[] args) {
		
		HashSet setA = new HashSet();
		HashSet setB = new HashSet();
		HashSet setC = new HashSet();
		HashSet setD = new HashSet();
		HashSet setE = new HashSet();

		setA.add("1"); setA.add("2"); setA.add("3"); setA.add("4"); setA.add("5");
		System.out.println("A = " + setA); //A = [1, 2, 3, 4, 5]
		setB.add("4"); setB.add("5"); setB.add("6"); setB.add("7"); setB.add("8");
		System.out.println("B = " + setB); //B = [4, 5, 6, 7, 8]
		
		//교집합
		Iterator iterator = setB.iterator();
		while (iterator.hasNext()) {
			Object tmp = iterator.next();
			if(setA.contains(tmp))
				setC.add(tmp);
		}
		System.out.println("교집합 = " + setC);
		
		//차집합
		iterator = setA.iterator();
		while (iterator.hasNext()) {
			Object tmp = iterator.next();
			if(!setB.contains(tmp))
				setD.add(tmp);
		}
		System.out.println("차집합 = " + setD);
		
		//합집합
		iterator = setA.iterator();
		while (iterator.hasNext()) {
			setE.add(iterator.next());
		}
		iterator = setB.iterator();
		while (iterator.hasNext()) {
			setE.add(iterator.next());
		}
		System.out.println("합집합 = " + setE);
		
	}

}

 

위의 코드를 간단화

package chapter11;

import java.util.HashSet;

public class Study09Ex4 {

	public static void main(String[] args) {
		
		HashSet setA = new HashSet();
		HashSet setB = new HashSet();

		setA.add("1"); setA.add("2"); setA.add("3"); setA.add("4"); setA.add("5");
		setB.add("4"); setB.add("5"); setB.add("6"); setB.add("7"); setB.add("8");
		

//		setA.retainAll(setB); //공통된 요소만 남기고 삭제 => 교집합
//		setA.addAll(setB); //setB의 모든 요소를 추가(중복 제외) => 합집합
//		setA.removeAll(setB); //setB와 공통 요소를 제거 => 차집합
		System.out.println(setA);
		
		
	}

}

 

728x90

'organize > 자바' 카테고리의 다른 글

Java 27  (0) 2024.05.14
Java 26  (0) 2024.05.13
Java 24  (0) 2024.05.09
Java 23  (0) 2024.05.08
Java 22  (0) 2024.05.07