Set

프로그래밍/Java 2019. 12. 17. 00:14

HashSet

해쉬는 순서가 정해져있지 않으며, 중복을 허용하지 않는 것이 특징이다.


HashSetTest

package collection.hashset;

import java.util.HashSet;

public class HashSetTest {
    public static void main(String[] args) {
        HashSet<String> hashSet = new HashSet<String>();

        hashSet.add(new String("임정순"));
        hashSet.add(new String("박현정"));
        hashSet.add(new String("홍연의"));
        hashSet.add(new String("강감찬"));
        hashSet.add(new String("강감찬"));

        System.out.println(hashSet);
    }
}

  • 3, 4번째 값이 같으므로, 중복된 값은 출력되지 않는다.

MemberHashSet (MemberArrayList 와 비교)

package collection.hashset;

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

import collection.Member;

public class MemberHashSet {
    private HashSet<Member> hashSet;

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

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

    public boolean removeMember(int memberId) {
        Iterator<Member> ir = hashSet.iterator();

        while(ir.hasNext()) {
            Member member = ir.next();
            int tempId = member.getMemberId();
            if(tempId == memberId) {
                hashSet.remove(member);
                return true;
            }
        }
        System.out.println(memberId + "가 존재하지 않습니다.");        
        return false;
    }

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

}
  • 기능은 기존 MemberArrayList와 같다.

테스트

package collection.hashset;

import collection.Member;

public class MemberHashSetTest {

    public static void main(String[] args) {
        MemberHashSet memberHashsSet = new MemberHashSet();

        Member memberLee = new Member(1001, "이지원");
        Member memberSon = new Member(1002, "손민국");
        Member memberPark = new Member(1003, "박서원");

        memberHashsSet.addMember(memberLee);    
        memberHashsSet.addMember(memberSon);    
        memberHashsSet.addMember(memberPark);    

        memberHashsSet.showAllMember(); // 순서대로 들어가지 않음.

        Member memberHong = new Member(1003, "홍길동");
        memberHashsSet.addMember(memberHong);
        memberHashsSet.showAllMember();


    }

}

  • 출력결과를 보면 hashSet은 중복을 허용하지 않는다고 했는데 아이디가 같은 홍길동이 출력 되었다.
  • 객체가 같다는 것은 주소가 같다는 것을 의미하는데 이건 Member 객체가 서로 다른 주소값을 가지고 있기에 서로 다른 값으로 인식하는 것이다.

Member클래스 Object 클래스 메서드 재정의(equals, hashCode)

    @Override
    public int hashCode() {
        return memberId;
    }

    @Override
    public boolean equals(Object obj) {
        if(obj instanceof Member) {
            Member member = (Member)obj;
            if(this.memberId == member.memberId)
                return true;
            else
                return false;
        }
        return false;
    }

테스트

TreeSet

트리셋은 중복을 허용하지 않으며, 이진트리로 순서를 정렬한다.


TreeSetTest

package collection.treeset;

import java.util.TreeSet;

public class TreeSetTest {
    public static void main(String[] args) {
        TreeSet<Integer> treeSet = new TreeSet<Integer>();
        treeSet.add(432);
        treeSet.add(33);
        treeSet.add(23);
        treeSet.add(1);

        for(Integer i : treeSet) {
            System.out.println(i);
        }
    }
}


MemberTreeSet

package collection.treeset;

import java.util.Iterator;
import java.util.TreeSet;

import collection.Member;

public class MemberTreeSet {
    private TreeSet<Member> treeSet;


    public MemberTreeSet() {
        treeSet = new TreeSet<Member>();
    }

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

    public boolean removeMember(int memberId) {
        Iterator<Member> ir = treeSet.iterator();

        while(ir.hasNext()) {
            Member member = ir.next();
            int tempId = member.getMemberId();
            if(tempId == memberId) {
                treeSet.remove(member);
                return true;
            }
        }
        System.out.println(memberId + "가 존재하지 않습니다.");        
        return false;
    }

    public void showAllMember() {
        for(Member member : treeSet) {
            System.out.println(member);
        }
        System.out.println();
    }

}
  • 기존 arrayList 와 hashSet과 같은 로직

테스트

  • 수행결과를 보면, Comparable 클래스 구현이 안되어있다고 한다.
  • TreeSet 리스트를 정렬하여 출력해야 하는데, Member객체는 어떤 것으로 정렬을 해야할지 정해지지 않아 생긴 것이다.
  • Integer 와 String 클래스의 경우는 내부적으로 구현되어있지만 사용자 정의 클래스는 개발자가 직접 정렬 기준을 정해줘야 한다.

Member 클래스 Comparable 클래스 구현

package collection;

public class Member implements Comparable<Member> {
    private int memberId;
    private String memberName;

    @Override
    public int hashCode() {
        return memberId;
    }

    @Override
    public boolean equals(Object obj) {
        if(obj instanceof Member) {
            Member member = (Member)obj;
            if(this.memberId == member.memberId)
                return true;
            else
                return false;
        }
        return false;
    }

    @Override
    public String toString() {
        return memberName + " 회원님의 아이디는 " + memberId + "입니다.";
    }

    public Member(int memberId, String memberName) {
        this.memberId = memberId;
        this.memberName = memberName;
    }

    public int getMemberId() {
        return memberId;
    }

    public void setMemberId(int memberId) {
        this.memberId = memberId;
    }

    public String getMemberName() {
        return memberName;
    }

    public void setMemberName(String memberName) {
        this.memberName = memberName;
    }

    @Override
    public int compareTo(Member member) {
        return (this.memberId - member.memberId);
//        return (this.memberId - member.memberId) * (-1);         // 오름차순
//        return this.memberName.compareTo(member.memberName);    // 이름으로 정렬

    }

}

 - compareTo 메서드를 재정의하여 정렬 기준을 정한다.


출처: do it 자바프로그래밍

'프로그래밍 > Java' 카테고리의 다른 글

Map  (0) 2019.12.20
싱글톤  (0) 2019.12.18
컬렉션 프레임워크  (0) 2019.12.14
제네릭  (0) 2019.12.14
Class 클래스  (0) 2019.12.12
블로그 이미지

파니동

,