JAVA Programming

[69] Map 에서의 HashMap 과 TreeMap

꾸준히개발하자 2020. 7. 20. 17:39

Map 인터페이스

쌍으로 구현된 쌍의 자료구조 이다.

Key value 를 가지고 있는데 key는 유일해야 한다.  자료를 쌍으로 pari 로 관리할 때 종종 있다. 이해하고 활용해볼수있다.

 

Map 인터페이스

검색을 위한 자료구조 , key을 이용하여 값을 저장하거나 검색 , 삭제 할 때 사용하면 편리하다.

내부적으로 hash 방식으로 구현된다.

Index = hash(key) // index 는 저장위치

Key가 되는 객체는 객체의 유일성함의 여부를 알기 위해 equals() hashCode() 메소드를 재정의 해야 한다.

 

HashMap 클래스

Map 인터페이스를 구현한 클래스 중 가장 일반적으로 사용하는 클래스

HashTable 클래스는 자바 2 부터 제공된 클래스로 Vector 처럼 동기화를 제공한다.

Pair 자료를 쉽고 빠르게 관리할수있다.

 

TreeMap 클래스   TreeSet과 비슷하게  인터페이스를 구현해야된다

key객체를 정렬하여 key-value pair 로 관리하는 클래스이다.

Key에 사용되는 클래스에 Comparable , Comparator 인터페이스를 구현한다

Java에 많은 클래스들은 이미 Comparable 이 구현되어 있다

구현된 클래스를 key로 사용하는 경우는 구현할 필요가 없다.

 

 

 

Member 클래스 

package hashmap;

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 + "입니다.";
	}
	
}

 

MemberHashMap 클래스 

 

map 에서 값을 넣을때는 put 사용 , 삭제할때는 remove 

그전에 삭제하기전에  키값이 containsKey  포함하고 있는지 있으면 키값으로 삭제할수있다.

 

순회할때는 키값으로 돌리던가 values값으로 돌리던가 하나로 해야한다.

 Iterator<Integer>  = hashMapkeySet().iterator();  반환값은 Iterator 객체가 key로 순환한다. 

package hashmap;

import java.util.HashMap;
import java.util.Iterator;

public class MemberHashMap {
	
	private HashMap<Integer, Member> hashMap; // key는 회원번호 값은 멤버

	public MemberHashMap() {
		hashMap = new HashMap<Integer,Member>();
	}
	
	public void addMember(Member member) { // 집어넣을때 멤버변수가 넘어온다.
	
		hashMap.put(member.getMemberID(), member); 
		// 멤버의 아이디와 넘어온 멤버를 넣는다.
	}
	
	public boolean removeMember(int memberID) { // 이 key값이 Integer로 int로 변환이 됨 
			// 이 key값이 hashMap 안에 있는지 여부를 본다
		if(hashMap.containsKey(memberID)) {  // 키값이 포함되어  있는지
			hashMap.remove(memberID); // 있으면  키값으로 지울수있다.
			return true;
		} else {
		System.out.println("회원 번호가 없습니다. ");
		return false;
		}
	}
	public void showAllMember() {
		// 키하고 값을 동시에 순회할수없다.  키를 가지고 순회하던가 값을 가지고 순회하던가
		
Iterator<Integer> ir = hashMap.keySet().iterator(); // 모든 key객체를 반환해준다. set<k> 타입으로 반환된다. Iterator 객체가 key 로 순환한다.
													// <Integer> 인티저로 순회한다.
  //  hashMap.values().iterator(); 모든  value 애들을 반환해주는데 중복될수도 있으니 Collection<V>으로 반환함 		
  	while(ir.hasNext()) {
  		int key = ir.next();
  		Member member = hashMap.get(key); // get으로 키를 주면 멤버가 반환이 된다.
  		System.out.println(member);
  		}
  	System.out.println("");
	}
}
package hashmap;

public class MemberHashMapTest {

	public static void main(String[] args) {
		
		MemberHashMap manager = new MemberHashMap();
		
		// TreeSet  회원의 아이디 순서대로 정렬을 하고 싶다면 ? 	
		Member memberLee = new Member(100,"이효리");
		Member memberKim = new Member(200,"강감찬");
		Member memberPark = new Member(300,"박범");
		Member memberPark2 = new Member(300,"박범");
		
		manager.addMember(memberLee); 
		manager.addMember(memberKim);
		manager.addMember(memberPark);
		manager.addMember(memberPark2); // member가 key값으로 되어있어서 
							// 이미 equals랑 hashCode가 이미구현되어있어서 intValue가 같으면 같은거라고해서 안들어감 
		
		manager.showAllMember();	
		manager.removeMember(200);
		manager.showAllMember(); // 200 삭제 
	}
}

이미 map은 equals 랑 hashCode가 상위클래스에서 구현되어 있다.

 

 

 

 

TreeMap은 

 

package treemap;

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 + "입니다.";
	}
	
	
}

 

package treemap;

import java.util.Iterator;
import java.util.TreeMap;

public class MemberTreeMap {
	
	private TreeMap<Integer, Member> treeMap; // key는 회원번호 값은 멤버
											  // Integer는 이미 Comparable 이 구현되어있다. 

	public MemberTreeMap() {
		treeMap = new TreeMap<Integer,Member>();
	}
	
	public void addMember(Member member) { // 집어넣을때 멤버변수가 넘어온다.
	
		treeMap.put(member.getMemberID(), member); 
		// 멤버의 아이디와 넘어온 멤버를 넣는다.
	}
	
	public boolean removeMember(int memberID) { // 이 key값이 Integer로 int로 변환이 됨 
			// 이 key값이 hashMap 안에 있는지 여부를 본다
		if(treeMap.containsKey(memberID)) {  // 키값이 포함되어  있는지
			treeMap.remove(memberID); // 있으면  키값으로 지울수있다.
			return true;
		} else {
		System.out.println("회원 번호가 없습니다. ");
		return false;
		}
	}
	public void showAllMember() {
		// 키하고 값을 동시에 순회할수없다.  키를 가지고 순회하던가 값을 가지고 순회하던가
		
Iterator<Integer> ir = treeMap.keySet().iterator(); // 모든 key객체를 반환해준다. set<k> 타입으로 반환된다. Iterator 객체가 key 로 순환한다.
													// <Integer> 인티저로 순회한다.
  //  hashMap.values().iterator(); 모든  value 애들을 반환해주는데 중복될수도 있으니 Collection<V>으로 반환함 		
  	while(ir.hasNext()) {
  		int key = ir.next();
  		Member member = treeMap.get(key); // get으로 키를 주면 멤버가 반환이 된다.
  		System.out.println(member);
  		}
  	System.out.println("");
	}
}
package treemap;

public class MemberTreeMapTest {

	public static void main(String[] args) {
		
		MemberTreeMap manager = new MemberTreeMap();
		
		// TreeSet  회원의 아이디 순서대로 정렬을 하고 싶다면 ? 	
		Member memberPark = new Member(300,"박범");
		Member memberLee = new Member(100,"이효리");
		Member memberKim = new Member(200,"강감찬");
		Member memberPark2 = new Member(400,"세세");
		
		manager.addMember(memberLee); 
		manager.addMember(memberKim);
		manager.addMember(memberPark);
		manager.addMember(memberPark2); // member가 key값으로 되어있어서 
   // 이미 equals랑 hashCode가 이미구현되어있어서 intValue가 같으면 같은거라고해서 안들어감 
		
		manager.showAllMember();	
		manager.removeMember(200);
		manager.showAllMember(); // 200 삭제 
	}
}