Java

Java 문법) 컬렉션 프레임워크 - Map 컬렉션

sejin2 2023. 11. 3. 17:18

Map 컬렉션

: 키와 값으로 구성된 엔트리 객체를 저장

키는 중복 저장이 안되지만, 값은 중복 저장 가능

기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대체

범주 메서드 또는 기능 설명
객체 추가 V put(K key, V value) 지정된 키(key)와 값(value)을 매핑, 이전 값 대체
객체 검색 V get(Object key) 주어진 키(key)에 대응하는 값 반환
  boolean containsKey(Object key) 주어진 키(key)가 맵에 존재하는지 확인
  boolean containsValue(Object value) 주어진 값(value)가 맵에 존재하는지 확인
  V get (Object key) 주어진 키(key)에 대응하는 값을 반환
객체 삭제 V remove(Object key) 주어진 키(key)와 연결된 항목을 맵에서 제거하고 그 값을 반환
  void clear( ) 모든 Map.Entry(키와 값)를 삭제

(1)  HashMap

: Map 인터페이스를 구현한 Java 컬렉션 클래스 중 하나로 키(key)와 값(value)을 사용하여 데이터를 저장하고 검색하는데 사용

  • 키-값 매핑: **HashMap**은 키(key)와 값(value) 간의 매핑을 저장하고, 키를 사용하여 값에 빠른 접근 가능
  • 무작위 접근: **HashMap**은 해시 테이블을 사용하므로 키를 이용한 데이터 접근이 매우 빠름
  • 중복된 키 처리: 하나의 **HashMap**에 동일한 키가 두 번 이상 나타날 수 없음 (중복된 키는 허용되지 않음)
  • 순서 보장 안됨: **HashMap**은 키-값 쌍의 순서를 보장하지 않음. 요소가 저장된 순서대로 접근 불가

예제 1 )

public class Map04 {
	public static void main(String[] args) {
		Map<Integer, String> map = new HashMap<Integer, String>();
		
		map.put(1, "최재호");
		map.put(2, "마리오");
		map.put(2, "루이지");	// 같은 키 값 넣으면 값이 변경 됨 
		System.out.println(map);
		
		Map<String, Double> map2 = new HashMap<String, Double>();
		map2.put("java", 34.55);
		map2.put("oracle", 87.668);
		map2.put("spring", 87.23);
		System.out.println(map2);
		System.out.println(map2.get("spring"));	// 키에 해당하는 값이 출력
		System.out.println(map2.remove("spring"));	
		System.out.println(map2);
		System.out.println("----------");
		mapPrint(map);
	}
	
	static void mapPrint(Map<Integer, String> map) {
		Set<Integer> keyset = map.keySet();
		Iterator<Integer> keyIterator = keyset.iterator();
		while(keyIterator.hasNext()) {
			int key = keyIterator.next();
			map.get(key);
			String value = map.get(key);
			System.out.println(key + ":" + value);
		}
	}
}

예제 1 - 출력결과 )

(2) TreeMap

: 이진 트리를 기반으로 한 Map컬렉션

키와 값이 저장된 엔트리 저장

?? Entry"는 자바의 맵 (Map) 인터페이스에서 사용되는 용어로, 맵은 키(key)와 값(value)으로 구성된 쌍을 저장하는 자료 구조이며, 각 쌍은 맵의 "entry"로 간주.

맵의 구현체 중 하나인 HashMap 또는 TreeMap 등에서 맵의 각 entry에 접근할 수 있는 메서드 entrySet()을 제공.

 

코드예제 1 )

class Snack {
	private String flavor;
	private int calory;
	
	public Snack() { 
		
	}
	public Snack(String flavor, int calory) { 
		this.flavor = flavor;
		this.calory = calory;
	}
	public String getFlavor() {
		return flavor;
	}
	public void setFlavor(String flavor) {
		this.flavor = flavor;
	}
	public int getCalory() {
		return calory;
	}
	public void setCalory(int calory) {
		this.calory = calory;
	}
	@Override
	public String toString() {
		return "Snack [flavor=" + flavor + ", calory=" + calory + "]";
	}  
}
 
public class TreeMap08 {
	public static void main(String[] args) {
		HashMap<String, Snack> map = new HashMap< >();
		// key : 과자명, 값 : Snack객체
		map.put("오예스", new Snack("초코맛", 1500));
		map.put("새우깡", new Snack("매운맛", 1200));
		map.put("자가비", new Snack("감자맛", 2000));
		map.put("오잉", new Snack("해물맛", 1600));
		
		System.out.println(map);
		map.put("새우깡", new Snack("새우맛", 1000));
		System.out.println(map);
		
		TreeMap<String, Integer> treeMap = new TreeMap<>();
		treeMap.put("foever", 70);
		treeMap.put("baby", 2);
		treeMap.put("dog", 30);
		treeMap.put("apple", 50);
		treeMap.put("cat", 65);
		treeMap.put("eleven", 40);
		treeMap.put("guess", 70);
		
		NavigableMap ns = (NavigableMap)treeMap.subMap("c", "g");
		System.out.println(ns);
		System.out.println(treeMap.subMap("c", "g"));
		
		TreeMap<Integer, String> tMap = new TreeMap<>();
		tMap.put(89, "마리오");
		tMap.put(66, "루이지");
		tMap.put(78, "톳텐");
		tMap.put(90, "키노피오");
		tMap.put(85, "요시");
		
		Map.Entry<Integer, String> entry = tMap.firstEntry();	// 가장 낮은 점수 
		System.out.println("가장 낮은 점수 : " + entry);
						// key만 얻어올 때 : entry.getKey( ), // 값만 얻어올 때 : entry.getValue( )
		System.out.println("가장 높은 점수 : " + tMap.lastEntry());
		
		
		System.out.println("100점 아래 점수 : " + tMap.lowerEntry(100));
		System.out.println("78점 위 점수 : " + tMap.higherEntry(78));
		
		System.out.println("78점과 동일한 점수 아니면 바로 아래 점수 : " + tMap.floorEntry(78));
		System.out.println("90점과 동일한 점수 아니면 바로 위의 점수 : " + tMap.ceilingEntry(90));
		
		System.out.println("70점과 동일한 점수 아니면 바로 아래 점수 : " + tMap.floorEntry(70));
		System.out.println("88점과 동일한 점수 아니면 바로 위의 점수 : " + tMap.ceilingEntry(88));
		
		
	}
}

예제 1 - 출력결과 )