Colletion 의 개체를 순회하는 인터페이스
iterator()메서드 호출
Iterator ir = memberArrayList.iterator();
Iterator에 선언된 메서드
예제
Colletion 하위의 인터페이스
중복을 허용하지 않음
List는 순서기반의 인터페이스지만, Set은 순서가 없음
get(i)는 메서드가 제공되지 않음(Itrator로 순회)
저장된 순서와 출력순서는 다를 수 있음
아이디, 주민번호, 사번 등 유일한 값이나 객체를 관리할 때 사용
HashSet, TreeSet 클래스
Set 클래스를 구현한 클래스
중복을 허용하지 않으므로 저장되는 객체의 동일함 여부를 알기 위해 equals()와 hashCode()메서드를 재정의 해야 한다
import java.util.HashSet;
import java.util.Iterator;
public class HashSetTest {
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();// set인터페이스를 구현한 hashSet클래스
set.add("이순신");
set.add("김유신");
set.add("유관순");
set.add("김홍도");
set.add("강감찬");
set.add("이순신"); // 중복값은 입력이 안됨
System.out.println(set); // toString();
//[김유신, 강감찬, 이순신, 유관순, 김홍도]// 순서는 순차적이 아님
Iterator<String> ir = set.iterator(); // Colletino 인터페이스 구현한 클래스는 다숑ㅇ가능
while(ir.hasNext()){ // hsNext는 다음 자료가 있는지 체크
String str = ir.next();// next는 다음자료를 담는역할
System.out.println(str);
}
}
}
public class 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 + "입니다.";
}
}
@Override
public int hashCode() {
return memberId;// intger값하면 반환하면되는데 memberId로 구분할거니까 바로 리턴
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Member){
Member member = (Member)obj;
return this.memberId == member.memberId;
}
return false;
}
먼저 자료구조에 입력될 객체를 만들기 위해 member 클래스를 작성한다
toStirng() 메서드를 재정의하여 Member name과 Id를 출력하게 한다
hashCode() 메서드를 재정의하여 구분하는 값을 memberId를 사용한다
equals() 메서드를 재정의하여 입력된 객체가 Member 객체가 맞는지 확인하여 맞으면 memberId가 서로 같으면 같은 객체라고 취급한다
import java.util.HashSet;
import java.util.Iterator;
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();
if(member.getMemberId() == 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("");
}
}
HashSet을 선언하고 타입을 로 하여 Member 객체를 활용할 수 있도록 한다
요소를 제거할 수 있는 removeMember()메서드를 작성하고 Iterator를 활용하여 요소 하나 하나에 접근하여 입력한 memberId와 동일하다면 remove한다.
showAllmember() 메서드를 작성하고 향상된 for문을 통해 hashSet에 접근하면 iterator를 통해 접근한것과 같이 하나하나의 요소에 접근할 수 있다
public class MemberHashSetTest {
public static void main(String[] args) {
MemberHashSet manager = new MemberHashSet();
Member memberLee = new Member(100, "Lee");
Member memberKim = new Member(200, "Kim");
Member memberPark = new Member(300, "Park");
Member memberPark2 = new Member(300, "Park");
manager.addMember(memberLee);
manager.addMember(memberKim);
manager.addMember(memberPark);
manager.addMember(memberPark2);// equals와 hashcode 오버라이딩 하니 자동으로 안들어감..wow
manager.showAllmember();
// Lee회원님의 아이디는 100입니다.
// Kim회원님의 아이디는 200입니다.
// Park회원님의 아이디는 300입니다.
}
}
import java.util.TreeSet;
public class TreeSetTest {
public static void main(String[] args) {
TreeSet<String> treeSet = new TreeSet<String>();
treeSet.add("홍길동");
treeSet.add("강감찬");
treeSet.add("이순신");
for(String str : treeSet){
System.out.println(str); // 강감찬 이순신 홍길동// 오름찬순되어있음
//String에 이미 Comparable 구현되어잇음
}
}
}
String 자료를 TreeSet 자료구조에 넣고 출력을 하니 오름차순으로 자동으로 정렬이 된다
하지만 보통 참조자료형의 경우 Comparable이 구현되어 있지 않기 때문에 따로 구현해주어야 할 필요성이 있는데 예제 2를 통해 구현에 예제2를 살펴보겠다
package Colletion.treeset;
public class Member implements Comparable<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 + "입니다.";
}
@Override
public int hashCode() {
return memberId;// intger값하면 반환하면되는데 memberId로 구분할거니까 바로 리턴
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Member){
Member member = (Member)obj;
return this.memberId == member.memberId;
}
return false;
}
@Override
public int compareTo(Member member) {
return this.memberId - member.memberId ;
}
// @Override
// public int compareTo(Member member) {
//
// return this.memberName.compareTo(member.getMemberName());
// }
}
자료의 정렬을 위해 Member클래스에 Comparable 를 구현합니다.
또한 Comparator를 구현해서 사용하는 방법도 있다
package Colletion.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 + "입니다.";
}
@Override
public int hashCode() {
return memberId;// intger값하면 반환하면되는데 memberId로 구분할거니까 바로 리턴
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Member){
Member member = (Member)obj;
return this.memberId == member.memberId;
}
return false;
}
@Override
public int compare(Member member1, Member member2) {
return member1.memberId - member2.memberId;
}
}
public MemberTreeSet(){
TreeSet<Member> treeSet = new TreeSet<Member>(new Member());
}
package Colletion.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();
//Kim회원님의 아이디는 100입니다.
//Park회원님의 아이디는 200입니다.
//Lee회원님의 아이디는 300입니다.
}
}
정렬 대상( 자료역할 하는 클래스)이 되는 클래스가 구현해야 하는 인터페이스
Comparable은 compareTo()메서드를 구현
Comparator는 compare()메서드를 구현
두 개의 매개 변수를 비교한다
TreeSet 생성자에 Comparator가 구현된 객체를 매개변수로 전달해야 한다
TreeSet<Member> treeSet = new TreeSet<Member>(new Member());
일반적으로는 Comparable을 많이 사용한다
import java.util.Comparator;
import java.util.TreeSet;
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) {
TreeSet<String> treeSet = new TreeSet<String>(new Mycompare());
treeSet.add("홍길동");
treeSet.add("강감찬");
treeSet.add("이순신");
for (String str : treeSet) {
System.out.println(str);
}
}
}