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 자바프로그래밍