JAVA Programming

[65] Set 인터페이스 (Iterator 순회 , 중복x, 순서대로x)

꾸준히개발하자 2020. 7. 20. 14:38

.Set 인터페이스

ArrayList 에서는 순서가 정해져 있어서  get(i) 인덱스번호로 순회할수있는데

Set 인터페이스는 순서대로 지정할수없어서 있는걸 뺴내는 방식인데

Iterator 객체를 이용해서 사용할수있다.

모든 콜렉션을 iterator를 호출하면 Iterator이 반환할수있다.

 

 

 

HashSet<String> 생성해서  

set.add() 할시  HashSet 인터페이스에 중복을 허용하지않는 메소드가 정의되어 있어서 

추가해도 중복이 되지 않는다.

순서가 정해지지 않아서 iterator 순회해서 값을 가져온다. 

 

while 반복 동안   boolean 을 반환을 하는데  다음요소의 값이 있을때까지

next() 로 가져온다  현재 반환값이  String 이 되니까 String  str 로 받을수있다.  

 

package set;

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

public class HashSetTest {
	
	public static void main(String[] args) {
	HashSet<String> set = new HashSet<String>();
					// set은 get 으로 가져오는게 아니라 Iterator 순회 하면서 hasNext(),next() 가져온다.
	set.add("이순신");
	set.add("김유신");
	set.add("강감찬");
	set.add("이순신");
	
	System.out.println(set); // set은 순서대로 나오지 않고 중복되어 나오지 않는다. ex) 주민번호,사번,학번 
	Iterator<String> ir =  set.iterator(); // 순회 
	
	while(ir.hasNext()) { // boolean 을 반환을 해주는데  다음 요소가 있는지 
		String str = ir.next(); // 있으면 가져온다. 현재 반환값이 String이 되니까 String으로 받을수있다.
		System.out.println(str);
		}
	}
}

 

 

2. 학번과 학생이름을  Set 으로 관리해보자

 

package set;

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 +" 입니다.";
	}
	
	// Set 에서 중복을 방지하려면  MemberID 값이 같으면 true로 리턴 , hashCode도 정의해줘야한다.
	@Override
	public boolean equals(Object obj) {
		Member member = (Member)obj; // 다운캐스팅
		if(member.memberID == memberID) {
			return true;
		} else {
			return false;
		}
	}
	@Override
	public int hashCode() {
		return memberID;
	}
}

 

HashSet 으로 멤버들을 관리해보기

HashSet 을 선언하고 생성한다.

거기에 멤버를  추가하는  addMember 와  멤버를 삭제하는  removeMember 메소드 를 추가한다.

 

모든 멤버를 보여주는 showAllMember 메소드 도  빠른 for문 으로 생성한다.

package set;

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



public class MemberHashSet {
	// HashSet 으로 멤버들을 관리해 보기 
	
	private HashSet<Member> hashset;
	
	
	public MemberHashSet() {
	
		hashset = new HashSet<Member>();
	}
	//멤버 한명 추가
	public void addMember(Member member) { // 멤버가 매개변수로 넘어온다. 
		hashset.add(member);
	}
	public boolean removeMember(int memberID) { // 멤버 아이디를 알아야지 해당하는 값을 삭제할수있다. 
		// 한명한명 봐야하니 Iterator 를 써야한다.
		
		Iterator ir = hashset.iterator();
		if(ir.hasNext()) {
			Member 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); // toString 구현된게 호출 
		}
		System.out.println();
	}
}

 

 

 

멤버를 만들고  addMember 메소드의 매개변수에 객체를 추가한다.

 

package set;

public class MemberHashSetTest {

	public static void main(String[] args) {
		
		MemberHashSet manager = new MemberHashSet();
		
		// 멤버를 만들고 add 하면 된다.
		Member memberLee = new Member(100,"이효리");
		Member memberKim = new Member(200,"강감찬");
		Member memberPark = new Member(300,"박범");
		Member memberPark2 = new Member(300,"박범2");
		
		manager.addMember(memberLee); // 매개변수에 Member member 
		manager.addMember(memberKim);
		manager.addMember(memberPark);
		manager.addMember(memberPark2); 
		// 아이디가똑같이 300이 동시에 2개가 들어가게 되면 ? 
		// member 가 같다라는것을 정의해줘야 한다. 아이디가 같으면 같은멤버라는것을
		// 논리적으로 구현해줘야 한다.
		
		manager.showAllMember();
		
		manager.removeMember(100); // 100번은 지운다.
		manager.showAllMember();
	}
}

이때 아이디가 같으면

Member 클래스에서  equals 와 haschCode를 재정의해서  아이디가 같으면 true 를 줘서 같은값이 안들어가게 끔 만든다.