[JAVA][패스트캠퍼스]컬렉션 프레임워크_Set 인터페이스
Iterator로 순회하기
- Collection의 개체를 순회하는 인터페이스
- ArrayList와 다르게 set인터페이스는 내부적으로 순서대로 저장되지 않음 - iterator() 메서드 호출
Iterator ir=memberArrayList.iterator();
- Iterator에 선언된 메서드
아래와 같이 Member클래스와 다르게 중복된 값이 나오게 되는데 그 이유는 Member클래스가 논리적으로 구현되지 않았기 때문이다.
Member클래스에서 논리적으로 구현하기 위해 equals와 hashcode를 재정의해보자.
그 결과 중복하지 않은 값을 출력하게 됨
Set 인터페이스
- Collection 하위의 인터페이스
- 중복을 허용하지 않음
- List는 순서기반의 인터페이스지만, Set은 순서가 없음
- get(i) 메서드가 제공되지 않음 (Iterator로 순회)
- 저장된 순서와 출력순서는 다를 수 있음
- 아이디, 주민번호, 사번 등 유일한 값이나 객체를 관리할 때 사용
- HashSet,TreeSet 클래스
HashSet클래스
- Set 인터페이스를 구현한 클래스
- 중복을 허용하지 않으므로 저장되는 객체의 동일함 여부를 알기 위해 equals()와 hashCode()메서드를 재정의 해야함
TreeSet 클래스
- 객체의 정렬에 사용되는 클래스
- 중복을 허용하지 않으면서 오름차순이나 내림차순으로 객체를 정렬함
- 내부적으로 이진 검색 트리(binary search tree)로 구현되어 있음
- 이진 검색 트리에 자료가 저장될 때 비교하여 저장될 위치를 정함
- 객체 비교를 위해 Comparable이나 Comparator 인터페이스를 구현해야 함
Member.class
package collection.treeset;
import java.util.Comparator;
public class Member implements Comparator<Member>{
private int memberId;
private String memberName;
public Member() {}
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;
}
public String toString() {
return memberName+"회원님의 아이디는"+ memberId+"입니다.";
}
//HashSet의 결과를 출력할 때 중복되지 않은 값을 허용하게 하려면 hashcode와 equals를 재정의해야한다.
@Override
public int hashCode() {
return memberId;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Member) {
Member member=(Member)obj;
return (this.memberId == member.memberId);
}
return false;
}
//숫자로는 숫자끼리 구현이 되지만 다른객체와의 비교는 구현해야함
//this객체와 넘어온 매개변수와 비교
//이름을 오름차순으로 정렬함
/* @Override
public int compareTo(Member member) {
return this.memberName.compareTo(member.getMemberName());
}
*/
//member1이 this객체, member2가 넘어온 매개변수
//아이디를 오름차순으로 정렬함
@Override
public int compare(Member member1, Member member2) {
// TODO Auto-generated method stub
return (member1.memberId - member2.memberId);
}
}
MemberTreeSet.class
package collection.treeset;
import java.util.Iterator;
import java.util.TreeSet;
//TreeSet으로 멤버관리하기
public class MemberTreeSet {
private TreeSet<Member> treeSet;
public MemberTreeSet() {
//comparator할땐 TreeSet의 생성자에 new Member()추가해줘야함
treeSet=new TreeSet<Member>(new 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();
if(member.getMemberId() == 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();
}
}
MemberTreeSetTest.class
package collection.treeset;
public class MemberTreeSetTest {
public static void main(String[] args) {
MemberTreeSet manager=new MemberTreeSet();
Member memberLee= new Member(300,"Lee");
Member memberKim= new Member(100,"Kim");
Member memberPark= new Member(200,"Park");
manager.addMember(memberLee);
manager.addMember(memberKim);
manager.addMember(memberPark);
manager.showAllMember();
}
}
Comparable 인터페이스와 Comparator 인터페이스
- 정렬 대상이 되는 클래스가 구현해야 하는 인터페이스
- Comparable은 compareTo() 메서드를 구현
- 매개 변수와 객체 자신(this)를 비교 - Comparator는 compare()메서드를 구현
- 두 개의 매개 변수를 비교- TreeSet 생성자에 Comparator가 구현된 객체를 매개변수로 전달
TreeSet treeSet= New TreeSet(new Member());
- TreeSet 생성자에 Comparator가 구현된 객체를 매개변수로 전달
- 일반적으로 Comparable을 더 많이 사용
- 이미 Comparable이 구현된 경우 Comparator를 이용하여 다른 정렬 방식을 정의할 수 있음
ComparatorTest.class
package collection.treeset;
import java.util.Comparator;
import java.util.TreeSet;
//이미 Comparable이 구현된 경우 Comparator를 이용하여 다른 정렬 방식을 정의할 수 있음
class MyCompare implements Comparator<String>{
//내림차순으로 반환
@Override
public int compare(String s1, String s2) {
return s1.compareTo(s2)*(-1);
}
}
public class ComparatorTest {
public static void main(String[] args) {
//원래 String방식의 compareTo메서드를 호출하는 것이 아닌 Comparator방식으로 호출함
TreeSet<String> treeSet=new TreeSet<String>(new MyCompare());
treeSet.add("홍길동");
treeSet.add("김강찬");
treeSet.add("이순신");
for(String str : treeSet) {
System.out.println(str);
}
}
}
Author And Source
이 문제에 관하여([JAVA][패스트캠퍼스]컬렉션 프레임워크_Set 인터페이스), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kjhabc2002/JAVA패스트캠퍼스컬렉션-프레임워크Set-인터페이스저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)