Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

중복 허용하지 않는 Set 인터페이스 본문

Java/자료구조

중복 허용하지 않는 Set 인터페이스

Seung__ 2021. 10. 25. 21:04

1. HashSet클래스


  • Set인터페이스를 구현한 클래스와 
  • 멤버의 중복 여부를 체크하기 위해 인스턴스의 동일성을 확인해야함
  • 동일성 구현을 위해 필요에 따라 equals()와 hashCode()메서드를 재정의

 

 

2. HahsSet 활용


  • 앞 글에서 사용한 ArrayList를 HashSet으로 변경해보자.
public class MemberHashSet {

    private HashSet<Member> hashSet;

    public MemberHashSet() {
        hashSet = new HashSet<>();
    }

    public MemberHashSet(int size) {
        hashSet = new HashSet<>(size);
    }

    public void addMember(Member member){
        hashSet.add(member);
    }

    public Member getMember(int memberId){

        Iterator<Member> iterator = hashSet.iterator();

        while (iterator.hasNext()){
            Member member = iterator.next();

            if (member.getMemberId() == memberId){
                return member;
            }
        }

        return null;
    }

    public boolean removeMember(int memberId){

        Iterator<Member> iterator = hashSet.iterator();

        while (iterator.hasNext()){
            Member member = iterator.next();

            if (member.getMemberId() == memberId){
                hashSet.remove(member);
                return true;
            }
        }
        System.out.println("memberId :" + memberId + "존재하지 않습니다.");
        return false;
    }

    public void showAllMember(){
        for (Member member : hashSet) {
            System.out.println("member = " + member);
        }
        System.out.println();
    }

    public int getSize(){
        return hashSet.size();
    }
}

 

  • HashSet은 중복을 허용 안하니 member1과 동일한 member는 add해도 사이즈가 변하지 말아야 한다.
public class MemberHashSetTest {

    MemberHashSet memberHashSet;

    @BeforeEach
    void beforeTest(){

        memberHashSet = new MemberHashSet();

        Member member1 = new Member(1001, "A");
        Member member2 = new Member(1002, "B");
        Member member3 = new Member(1003, "C");
        Member member4 = new Member(1004, "D");

        memberHashSet.addMember(member1);
        memberHashSet.addMember(member2);
        memberHashSet.addMember(member3);
        memberHashSet.addMember(member4);

    }



    @Test
    void addMemberTest(){
        //given
        Member member = new Member(1001, "A");

        //when
        memberHashSet.addMember(member);

        //then
        assertEquals(memberHashSet.getSize(), 4);

        memberHashSet.showAllMember();

    }
}
  • 따라서 member1과 동일한 member를 추가하면 size는 4로 동일해야 하나.. 5이다.
  • debug를 해보면 Member가 중복되게 들어갔다.

  • 왜냐? Member 내부에 같은 Member라고 정의할 수 있는 방법을 가지고 있지 않기 때문.
    • equals(), hashCode()
    • HashSet에서 객체가 동일하지 확인하기 위해 해당 클래스의 equals(), hashCode()를 사용함.
    • equals(): 객체가 논리적으로 동일한지 확인.
    • hashCode():  hashCode반환
    @Override
    public boolean equals(Object o) {
        if (o instanceof Member){
            Member member = (Member) o;

            if (this.memberId == member.memberId){
                return true;
            }
            else return false;
        }
        return false;
    }

    @Override //hashcode반환
    public int hashCode() {
        return memberId;
    }

 

 

  • 테스트를 다시 실행해보자.
    • 논리적으로 동일한 객체를 HashSet에 add해보자.
    • 기존에 size가 4이기 때문에 add실행을 해도 4로 유지되어야 한다.
    @Test 
    void MemberOverlapTest(){
        //given
        Member member = new Member(1001, "A");

        //when
        memberHashSet.addMember(member);

        //then
        assertEquals(memberHashSet.getSize(), 4);

        memberHashSet.showAllMember();

    }

 

 

 

3. GitHub: 211025 HashSet


 

GitHub - bsh6463/dataStructure

Contribute to bsh6463/dataStructure development by creating an account on GitHub.

github.com

 

'Java > 자료구조' 카테고리의 다른 글

Pair로 관리하는 Map  (0) 2021.10.25
정렬을 위한 TreeSet 활용  (0) 2021.10.25
Collection 요소를 순회하는 Iterator  (0) 2021.10.24
List 인터페이스를 구현한 클래스, 활용  (0) 2021.10.24
컬렉션 프레임워크  (0) 2021.10.24
Comments