HashMap은 key-value pair(Entry)를 저장하며, 중복된 key 값은 저장되지 않습니다. 또한, Entry는 저장되는 순서와 다르게 HashMap 내부에서 임의의 순서로 저장됩니다.
1. HashMap 생성 및 초기화
HashMap<TYPE1, TYPE2>
는 key의 타입이 TYPE1이고, value의 타입이 TYPE2인 HashMap을 선언합니다.
HashMap::new()
로 HashMap 객체를 생성할 수 있습니다.
let mut my_map: HashMap<&str, &str> = HashMap::new();
insert(key, value)
로 HashMap에 데이터를 추가할 수 있으며, 이런 경우 key와 value의 타입을 컴파일러가 알고 있기 때문에 HashMap을 선언할 때 타입을 생략해도 됩니다.
use std::collections::HashMap;
fn main() {
let mut my_map = HashMap::new();
my_map.insert("a", "10");
my_map.insert("b", "20");
my_map.insert("c", "30");
println!("{:?}", my_map);
}
Output:
{"b": "20", "a": "10", "c": "30"}
2. HashMap에 Entry 추가: insert()
위의 예제에서 소개한 것처럼 push(key, value)
는 key-value pair를 HashMap에 추가합니다.
- HashMap은 중복 key를 허용하지 않음(동일한 key의 Entry가 2개 이상 저장되지 않음)
- 만약 중복 key로 Map에 Entry를 추가를 하면, 마지막에 추가된 value로 Entry가 업데이트됨
use std::collections::HashMap;
fn main() {
let mut my_map: HashMap<&str, &str> = HashMap::new();
my_map.insert("a", "10");
my_map.insert("b", "20");
my_map.insert("c", "30");
my_map.insert("a", "40");
println!("{:?}", my_map);
}
Output:
{"a": "40", "b": "20", "c": "30"}
3. HashMap에서 Entry 접근: get()
get(key)
는 HashMap에서 key를 찾고 value를 Option 타입으로 리턴합니다.
use std::collections::HashMap;
fn main() {
let mut my_map: HashMap<&str, &str> = HashMap::new();
my_map.insert("a", "10");
my_map.insert("b", "20");
my_map.insert("c", "30");
let ret = my_map.get("b");
println!("Found {:?}", ret);
}
Output:
Found Some("20")
Option 타입 안에 value가 저장되어있는데, 아래와 같이 match 키워드로 value에 접근할 수 있습니다.
- HashMap에 찾으려는 key가 없으면 None이 리턴되어 예외처리 가능
- HashMap에 찾으려는 key가 있으면 Some이 리턴되어 value에 접근할 수 있음
use std::collections::HashMap;
fn main() {
let mut my_map: HashMap<&str, &str> = HashMap::new();
my_map.insert("a", "10");
my_map.insert("b", "20");
my_map.insert("c", "30");
match my_map.get("b") {
Some(value) => {
println!("Found value: {}", value);
}
None => {
println!("Nothing found");
}
}
}
Output:
Found value: 20
아래와 같이 더 짧은 코드로 match 구문을 작성할 수 있습니다.
match my_map.get(&"b") {
Some(value) => println!("Found value: {}", value),
None => println!("Nothing found")
}
4. HashMap의 Entry 제거: remove()
remove(&key)
는 HashMap에서 key와 일치하는 Entry를 삭제합니다.
use std::collections::HashMap;
fn main() {
let mut my_map: HashMap<&str, &str> = HashMap::new();
my_map.insert("a", "10");
my_map.insert("b", "20");
my_map.insert("c", "30");
println!("{:?}", my_map);
// "b" 삭제 후 확인
my_map.remove(&"b");
println!("{:?}", my_map);
}
Output:
{"b": "20", "a": "10", "c": "30"}
{"a": "10", "c": "30"}
5. 특정 key 포함 여부 확인: contains_key()
contains_key(key)
는 HashMap에 key가 저장되어있을 때 true를 리턴합니다.
use std::collections::HashMap;
fn main() {
let mut my_map: HashMap<&str, &str> = HashMap::new();
my_map.insert("a", "10");
my_map.insert("b", "20");
my_map.insert("c", "30");
if my_map.contains_key("b") {
println!("Has key 'b'");
}
}
Output:
Has key 'b'
6. HashMap의 모든 Entry 순회
iter()
는 HashMap의 모든 Entry를 가리키는 Iterator를 리턴합니다.
아래와 같이 for문으로 모든 Entry(key-value)를 참조할 수 있습니다.
use std::collections::HashMap;
fn main() {
let mut my_map: HashMap<&str, &str> = HashMap::new();
my_map.insert("a", "10");
my_map.insert("b", "20");
my_map.insert("c", "30");
for (key, val) in my_map.iter() {
println!("key: {}, val: {}", key, val);
}
}
Output:
key: c, val: 30
key: a, val: 10
key: b, val: 20
7. HashMap 길이: len()
len()
는 HashMap에 저장된 Entry들의 개수를 리턴합니다.
use std::collections::HashMap;
fn main() {
let mut my_map: HashMap<&str, &str> = HashMap::new();
my_map.insert("a", "10");
my_map.insert("b", "20");
my_map.insert("c", "30");
println!("length: {}", my_map.len());
}
Output:
length: 3
Related Posts
- Rust - String을 char 리스트(Vector)로 변환
- Rust - 문자가 대문자인지 소문자인지 확인
- Rust - String에서 줄바꿈(newline) 문자 제거 방법
- Rust - String 대문자, 소문자 변환
- Rust - 현재 시간 가져오기 (DateTime, chrono)
- Rust - 예외 처리 방법 (Exception handling)
- Rust - String.find()으로 문자열 Index 찾기
- Rust - match (Switch) 사용 방법
- Rust - Vector의 요소 제거 방법 (remove, retain, drain)
- Rust - String의 특정 Index 값 가져오기
- Rust - 문자열 뒤집기, 역순으로 변경
- Rust - String 객체에 문자열 추가하기
- Rust - sleep(), 몇 초 지연/대기 방법
- Rust - String을 Int, Float으로 변환
- Rust - Integer를 String으로 변환
- Rust - Float를 String으로 변환
- Rust - String 비교 방법 (==, !=, eq, ne)
- Rust - String을 str으로, str을 String으로 변환
- Rust - String 공백 제거 (trim, replace)
- Rust - 2개의 배열이 같은지 비교 (==, equals)
- Rust - 배열 길이 가져오기 (Array length)
- Rust - Vector를 배열로 변환 (vector to array)
- Rust - 배열의 최소, 최대 값 찾기 (min, max)
- Rust - 배열의 합계, 평균 (sum, average)
- Rust - 2개의 Vector가 같은지 비교 (==, equals)
- Rust - HashMap을 Vector로 변환
- Rust - Vector의 최소, 최대 값 찾기 (min, max)
- Rust - Vector의 합계, 평균 (sum, average)
- Rust - 벡터 길이 가져오기 (Vector length)
- Rust - 배열을 HashSet으로 변환
- Rust - 배열을 벡터로 변환하는 방법
- Rust - 배열(벡터) 모든 요소 출력
- Rust - 배열 나누기, 자르기 (split_at, slice)
- Rust - 2개 벡터 하나로 합치기
- Rust - HashSet을 Vector로 변환