[java] HashSet, LinkedHashSet

심심이·2024년 3월 3일
0

java

목록 보기
40/46

hashSet

  • 순서X, 중복X, set인터페이스를 구현한 대표적 컬렉션 클래스
  • 순서를 유지하려면 LinkedHashSet 클래스 사용

1. 생성자

HashSet(),
HashSet(Collection C),
HashSet(int initialCapacity) - 초기용량을 정해줌
HashSet(int initialCapacity, float loadFactor) - 초기용량을 언제 늘릴건지 (float loadFactor0.8은 80%)


2.메서드

boolean add(Object O) : 추가
boolean addAll(Collection C) : 모두 추가 - 합집합
boolean remove(Object o) : 삭제
boolean removeAll(Collection C) : 삭제 - 차집합
boolean retainAll(Collection C) : 조건부 삭제(컬렉션만 남기고 삭제) - 교집합
void clear() : 모두삭제

boolean contains(Object o) : object가 포함되어 있는지?
boolean containsAll(Collection c) : 여러 객체가 모두 포함되어 있는지?

boolean isEmpty() : 비었는지?
int size() : 저장된 객체수
Object[] toArray() : set에 저장되있는 객체를 객체배열로 반환




// SetA.retainAll(SetB); // 교집합 
 SetA.addAll(SetB); // 합집합
System.out.println(SetA);

실습

1) set에 요소 저장하고 출력


    public static void main(String[] args) {
        Object[] objarr = {"1", new Integer(1), "2","2","3","3"};
        Set set = new HashSet();

        for (int i = 0; i < objarr.length; i++) {
            set.add(objarr[i]); // Hashset에 objarr의 요소들 저장
        }

        System.out.println(set); // set에 저장된 요소들 출력
        // [1, 1, 2, 3] 출력
        // 중복된 것은 출력되지 않음 !!! (1은 "1", 1 으로 타입이 다르므로 출력)

        //  Iterator란 자바의 컬렉션(Collection)에 저장되어 있는 요소들을 순회하는 인터페이스이다.
        // 사용방법 :  Iterator<T> iterator = Collection.iterator();
        // 읽어올 다음 요소가 있는지 판단하는 hasNext() /  다음 요소를 가져오는 next() / 가져온 요소를 삭제하는 remove() 메소드 사용 가능

        // HashSet에 저장된 요소들 출력(Iterator이용)
        Iterator it = set.iterator();

        while (it.hasNext()) {  // 데이터를 꺼내서 있는지 확인 (true, false return)  가지고 있는 데이터중 하나를 끄집어내서 존재하는지를 알아보는 것이다. 존재하면 true, 존재하지 않으면 false.(boolean) 
            System.out.println(it.next());
        } // 읽어올 요소가 없을때까지 계속 반복. 실제로 Member를 itr에서  끄집어낸다. 그러면 끄집어 낸 Member는 더이상 itr에는 남아있지 않게 된다.

        // set의 특징 : 순서를 유지하지 않고 중복된 요소를 허용하지 않는다 !! 

    }

2) set list로 정렬하기



public class set2_pr_main_4 {
    public static void main(String[] args) {
        Set set = new HashSet();
        // set의 크기가 6보다 작은 동안 1~45사이의 난수를 저장
        for (int i = 0; set.size() < 6; i++) {
            int num = (int)(Math.random() * 45) + 1;
//            set.add(new Integer(num));
            //컴파일러가 자동으로 아래처럼 변환
            set.add(num);
        }
        // 정렬되지 않은 상태로 나옴

        //정렬 : 순서 유지가 되어야 하는데 set은 정렬불가
        // set을 list로 넘기고 list를 정렬하면 된다.
        // 1. set의 모든 요소를 List에 저장
        // 2. List를 정렬
        // 3. List를 출력
        List list = new LinkedList(set); // LinkedList(Collection c) . 1
        Collections.sort(list); // 2
        System.out.println(list); // 3


    }
}

특정 정보 객체 출력

// mbr_set 에 저장되어진 Member 객체들 중에서 id가 "kimth" 인 객체만 정보를 출력해본다.
Iterator<Member> itr = mbr_set.iterator();
// mbr_set 에 저장된 모든 Member 객체 정보가 담아진다.

String id = "kimth";
boolean isExist = false;

while (itr.hasNext()) { //데이터가 있는지 확인
    Member mbr = itr.next(); // itr에 담긴 객체 member의 정보를 가져온다. -> 그 정보는 더이상 itr에는 남아 있지 않다.(itr는 일회성) 
    if(id.equals(mbr.getId())) {
        isExist = true;
        System.out.println(mbr);
    }
}
if(!isExist) {
    System.out.println(">> 아이디가 "+id+" 인 회원은 없습니다.<<");
}

객체 삭제



// mbr_set 에 저장되어진 Member 객체들 중에서 id 값이 "kimth" 인 객체를 삭제하세요 
itr = mbr_set.iterator(); // 일회성이므로 다시 코드 입력

while(itr.hasNext()) {
	Member mbr = itr.next();
	if("kimth".equals(mbr.getId())) {
		itr.remove();
		// mbr_set 에 저장된 요소(Element)를 삭제하려면 
		// Iterator를 이용한 itr.remove(); 을 사용하여 삭제한다.
	}
}// end of while---------------------------

System.out.println(">>> kimth 을 삭제한 후 모든 객체 정보 출력하기 <<<");

itr = mbr_set.iterator();

while(itr.hasNext()) {
	Member mbr = itr.next();
	System.out.println(mbr);
}// end of while---------------------------

HashSet은 객체를 저장하기 위해 기존에 같은 객체가 있는지 확인해야 함 (있으면 저장하지 않음) - list는 확인 안하고 다 저장(중복 허용하니까)


메모리 주소가 다른 중복 값 제거

	public static void main(String[] args) {
	
		System.out.println("\n === HashSet === \n");
		
		// Member 클래스의 객체만을 저장할 수 있는 HashSet 객체 mbr_set 을 생성한다. 
		Set<Member> mbr_set = new HashSet<>();
		
		// Member 클래스의 객체를 mbr_set 에 저장한다.
		mbr_set.add(new Member("youjs","Qwer1234$","유재석","7209101"));
		mbr_set.add(new Member("eom","Qwer1234$","엄정화","6808152"));
		mbr_set.add(new Member("kanghd","Qwer1234$","강호동","7006151"));
		mbr_set.add(new Member("leess","Qwer1234$","이순신","0010203"));
		mbr_set.add(new Member("kimth","Qwer1234$","김태희","0105064"));
		mbr_set.add(new Member("kimth","Qwer1234$","김태희","0105064")); // 메모리상 주소 다름
		
		Member mem1 = new Member("kwonjy","Qwer1234$","권지용","0303203");
		Member mem2 = mem1;
		mem2.setName("지드래곤"); // 지드래곤 1번밖에 출력 안됨
		
		mbr_set.add(mem1); 
		mbr_set.add(mem2); // 중복된 데이터를 저장할 수 없다.!!!
		
		// mbr_set 에 저장되어진 모든 Member 객체들의 정보를 출력해본다.
		Iterator<Member> itr = mbr_set.iterator();
		
		while(itr.hasNext()) {
			// itr.hasNext() 은 
			// itr 에서 현재 itr가 가지고 있는 여러 Member 데이터중 
			// 하나를 끄집어내서 존재하는지를 알아보는 것이다.
			// 존재하면 true, 존재하지 않으면 false.
			
			Member mbr = itr.next();
			// 실제로 Member를 itr 에서 끄집어낸다.
			// 그러면 끄집어 낸 Member는 더이상 itr 에는 남아있지 않게 된다.
			
			System.out.println(mbr);
		}// end of while---------------------------
		
		System.out.println("\n~~~~~~~~~~~~~~~~~~~\n");
		

위 코드에서 김태희는 중복된 값임에도 메모리 주소가 다르기 때문에 중복 제거가 안되고 출력이 된다.
만약 같은 값도 중복을 제거하고 싶다면
Member 클래스에 equals() 와 hashCode()를 오버라이딩 한다. (generate에 hashcode() , equals() 오버라이딩) 아래와 같이 작성된다.


public class Member {
	@Override
	public boolean equals(Object obj) {
		if( !(obj instanceof Member) ) return false;

		Member mbr = (Member)obj; // obj 객체에는 name이란 field가 없으므로 강제로 member 클래스 형변환
		//자식 타입으로 강제형변환 시 자식에 있는 것을 가져다 쓸수 있음
		
		// 나 자신의 아이디,비밀번호,이름, 주민번호를 mbr과 비교
		return this.id.equals(mbr.id) &&
				this.passwd.equals(mbr.passwd) &&
				this.name.equals(mbr.name) &&
				this.jubun.equals(mbr.jubun);
	}

	@Override
	public int hashCode() {
		return Objects.hash(id, passwd, name, jubun);
	}

	private String id;
	private String passwd;
	private String name;
	private String jubun;
	
	public Member() {}
	
	public Member(String id, String passwd, String name, String jubun) {
		this.id = id;
		this.passwd = passwd;
		this.name = name;
		this.jubun = jubun;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPasswd() {
		return passwd;
	}

	public void setPasswd(String passwd) {
		this.passwd = passwd;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getJubun() {
		return jubun;
	}

	public void setJubun(String jubun) {
		this.jubun = jubun;
	}
	
	
	public String gender() {
		
		if(jubun == null) {
			return "";
		}
		
		else {
			if("1".equals(jubun.substring(6)) || 
			   "3".equals(jubun.substring(6)) ) {
				return "남";
			}
			else {
				return "여";
			}
		}
		
	}// end of public String gender()--------------------------------
		

	// 메소드의 오버라이딩(재정의)
	@Override
	public String toString() {
	    // toString은 자동으로 호출
		return "=== "+name+"님의 회원정보 ===\n"
	    	 + "1.아이디 : "+id+"\n"
	    	 + "2.비밀번호 : "+passwd+"\n"
	    	 + "3.성명 : "+name+"\n"
	    	 + "4.주민번호 : "+jubun+"\n"
	    	 + "5.성별 : "+gender()+"\n"
	    	 + "6.만나이 : "+MyUtil.age(jubun)+"세\n";

	}

문제풀이 및 학습 코드


public class Set_main_5 {

	public static void main(String[] args) {
	
		System.out.println("\n === HashSet === \n");
		
		// Member 클래스의 객체만을 저장할 수 있는 HashSet 객체 mbr_set 을 생성한다. 
		Set<Member> mbr_set = new HashSet<>();
		
		// Member 클래스의 객체를 mbr_set 에 저장한다.
		mbr_set.add(new Member("youjs","Qwer1234$","유재석","7209101"));
		mbr_set.add(new Member("eom","Qwer1234$","엄정화","6808152"));
		mbr_set.add(new Member("kanghd","Qwer1234$","강호동","7006151"));
		mbr_set.add(new Member("leess","Qwer1234$","이순신","0010203"));
		mbr_set.add(new Member("kimth","Qwer1234$","김태희","0105064"));
		mbr_set.add(new Member("kimth","Qwer1234$","김태희","0105064"));
		
		Member mem1 = new Member("kwonjy","Qwer1234$","권지용","0303203");
		Member mem2 = mem1;
		mem2.setName("지드래곤");
		
		mbr_set.add(mem1); 
		mbr_set.add(mem2); // 중복된 데이터를 저장할 수 없다.!!!
		
		// mbr_set 에 저장되어진 모든 Member 객체들의 정보를 출력해본다.
		Iterator<Member> itr = mbr_set.iterator();
		
		while(itr.hasNext()) {
			// itr.hasNext() 은 
			// itr 에서 현재 itr가 가지고 있는 여러 Member 데이터중 
			// 하나를 끄집어내서 존재하는지를 알아보는 것이다.
			// 존재하면 true, 존재하지 않으면 false.
			
			Member mbr = itr.next();
			// 실제로 Member를 itr 에서 끄집어낸다.
			// 그러면 끄집어 낸 Member는 더이상 itr 에는 남아있지 않게 된다.
			
			System.out.println(mbr);
		}// end of while---------------------------
		
		System.out.println("\n~~~~~~~~~~~~~~~~~~~\n");
		
		
		// mbr_set 에 저장되어진 Member 객체들 중에서 id가 "kimth" 인 객체만 정보를 출력해본다.
		String id = "kimth";
		itr = mbr_set.iterator();
		boolean isExist = false;
		while(itr.hasNext()) { // 읽어볼 데이터가 존재하면 true
			Member mbr = itr.next(); // 모든 정보를 끄집어내온다.
			if(id.equals(mbr.getId())) {
				isExist = true;
				System.out.println(mbr);
			}
		}// end of while---------------------------

		if(!isExist) {
			System.out.println(">> 아이디가 "+id+" 인 회원은 없습니다.<<");
		}


// mbr_set 에 저장되어진 Member 객체들 중에서 id 값이 "kimth" 인 객체를 삭제하세요
itr = mbr_set.iterator();

while(itr.hasNext()) {
	Member mbr = itr.next();
	if("kimth".equals(mbr.getId())) {
		itr.remove();
		// mbr_set 에 저장된 요소(Element)를 삭제하려면
		// Iterator를 이용한 itr.remove(); 을 사용하여 삭제한다.
	}
}// end of while---------------------------

System.out.println(">>> kimth 을 삭제한 후 모든 객체 정보 출력하기 <<<");

itr = mbr_set.iterator();

while(itr.hasNext()) {
	Member mbr = itr.next();
	System.out.println(mbr);
}// end of while---------------------------

		
		////////////////////////////////////////////////////////
		
		System.out.println("\n === LinkedHashSet === \n");
		
		// Member 클래스의 객체만을 저장할 수 있는 LinkedHashSet 객체 mbr_set2 을 생성한다. 
		Set<Member> mbr_set2 = new LinkedHashSet<>();
		
		// Member 클래스의 객체를 mbr_set2 에 저장한다.
		mbr_set2.add(new Member("youjs","Qwer1234$","유재석","7209101"));
		mbr_set2.add(new Member("eom","Qwer1234$","엄정화","6808152"));
		mbr_set2.add(new Member("kanghd","Qwer1234$","강호동","7006151"));
		mbr_set2.add(new Member("leess","Qwer1234$","이순신","0010203"));
		mbr_set2.add(new Member("kimth","Qwer1234$","김태희","0105064"));
		mbr_set2.add(new Member("kimth","Qwer1234$","김태희","0105064"));
		
		Member mem3 = new Member("kwonjy","Qwer1234$","권지용","0303203");
		Member mem4 = mem3;
		mem4.setName("지드래곤");
		
		mbr_set.add(mem3); 
		mbr_set.add(mem4); // 중복된 데이터를 저장할 수 없다.!!!
		
		// mbr_set2 에 저장되어진 모든 Member 객체들의 정보를 출력해본다.
		Iterator<Member> itr2 = mbr_set2.iterator();
		
		while(itr2.hasNext()) {
			// itr2.hasNext() 은 
			// itr2 에서 현재 itr2가 가지고 있는 여러 Member 데이터중 
			// 하나를 끄집어내서 존재하는지를 알아보는 것이다.
			// 존재하면 true, 존재하지 않으면 false.
			
			Member mbr = itr2.next();
			// 실제로 Member를 itr2 에서 끄집어낸다.
			// 그러면 끄집어 낸 Member는 더이상 itr2 에는 남아있지 않게 된다.
			
			System.out.println(mbr);
		}// end of while---------------------------
		
		System.out.println("\n~~~~~~~~~~~~~~~~~~~\n");
		
		
		// mbr_set2 에 저장되어진 Member 객체들 중에서 id가 "kimth" 인 객체만 정보를 출력해본다.
		String id2 = "kimth";
		itr2 = mbr_set2.iterator();
		boolean isExist2 = false; 
		while(itr2.hasNext()) {
			Member mbr = itr2.next();
			if(id2.equals(mbr.getId())) {
				isExist2 = true;
				System.out.println(mbr);
			}
		}// end of while---------------------------
		
		if(!isExist2) {
			System.out.println(">> 아이디가 "+id2+" 인 회원은 없습니다.<<");
		}
		
		
		// mbr_set2 에 저장되어진 Member 객체들 중에서 id2 값이 "kimth" 인 객체를 삭제하세요 
		itr2 = mbr_set2.iterator();
		
		while(itr2.hasNext()) {
			Member mbr = itr2.next();
			if("kimth".equals(mbr.getId())) {
				itr2.remove();
				// mbr_set2 에 저장된 요소(Element)를 삭제하려면 
				// Iterator를 이용한 itr2.remove(); 을 사용하여 삭제한다.
			}
		}// end of while---------------------------
		
		System.out.println(">>> kimth 을 삭제한 후 모든 객체 정보 출력하기 <<<");
		
		itr2 = mbr_set2.iterator();
		
		while(itr2.hasNext()) {
			Member mbr = itr2.next();
			System.out.println(mbr);
		}// end of while---------------------------		

	}// end of main()---------------------------------

}
profile
개발하는 심심이

0개의 댓글

관련 채용 정보