2017-01-02 2 views
1

녹과 LeetCode 문제를 해결하기 위해 노력하는 동안에서의 HashMap 만들기, 나는 이상한 문제가 발생했습니다

use std::collections::HashMap; 

fn two_sum(nums: &Vec<i32>, target: i32) -> (usize, usize) { 
    let mut map = HashMap::new(); 
    for (i, x) in nums.iter().enumerate() { 
     match map.get(target - x) { 
      Some(k) => return (k, i), 
      None => map.insert(x, i) 
     }; 
    } 
    return (0, 0); 
} 

fn main() { 
    let ret = two_sum(&vec![1,2,3], 4); 
    println!("{}, {}", ret.0, ret.1); 
} 

컴파일러는 불평 : 나는 원시 타입과 HashMap를 만들 수 없습니다 것 같습니다 :

error[E0308]: mismatched types 
--> two_sum.rs:6:23 
    | 
6 |   match map.get(target - x) { 
    |      ^^^^^^^^^^ expected reference, found i32 
    | 
    = note: expected type `&_` 
    = note: found type `i32` 

error[E0308]: mismatched types 
--> two_sum.rs:7:32 
    | 
7 |    Some(k) => return (k, i), 
    |        ^expected usize, found reference 
    | 
    = note: expected type `usize` 
    = note: found type `&_` 

Rust에서 HashMap과 함께 항상 참조를 사용해야합니까?

편집 :

이 필요처럼 ...이 솔루션은 어쨌든 조금 추한하지만 작품을 보이는 보인다.

use std::collections::HashMap; 

fn two_sum(nums: &[i32], target: i32) -> (usize, usize) { 
    let mut map = HashMap::new(); 
    for (i, x) in nums.iter().enumerate() { 
     let df = target - x; 
     if map.contains_key(&df) { 
      return (*map.get(&df).unwrap(), i); 
     } 
     map.insert(x, i); 
    } 
    return (0, 0); 
} 

fn main() { 
    let ret = two_sum(&vec![1,2,3], 4); 
    println!("{}, {}", ret.0, ret.1); 
} 

기본 유형과 함께 HashMaps를 사용하는 것이 더 나은 솔루션인지 아니면 모범 사례인지 궁금합니다.

  • 이 해시 동안, 그것은 그래서 Option<&V>

반환 K: Borrow<Q>, Q: Hash + Eq

  • 에 묶여 인수 &Q를 받아 : 당신이 get 방법의 서명을 선택하면

  • +0

    [std :: collections :: HashMap :: get] (https://doc.rust-lang.org/stable/std/collections/struct.HashMap.html#method.get)의 서명은 예라고 표시합니다. , 참조를 사용하십시오. – ljedrz

    +0

    주 :'two_sum'이'& [i32]'인수를 취하는 것은 더 관용적입니다 (가능한 인수의 엄격한 상위 집합을 허용하므로). –

    답변

    6

    , 당신은 깨닫게 될 겁니다 지도 자체에는 프리미티브가 포함되며 인터페이스get이어야하며 참조가 필요하며 참조가 반환됩니다.

    이것이 의미 : I (1) get 및 참조를 전달

    fn two_sum(nums: &Vec<i32>, target: i32) -> (usize, usize) { 
        let mut map = HashMap::new(); 
        for (i, x) in nums.iter().enumerate() { 
         match map.get(&(target - x)) { 
          //  ^~~~~~~~~~~~~ 
          Some(k) => return (*k as usize, i), 
          //     ^~~~~~~~~~~ 
          None => map.insert(x, i) 
         }; 
        } 
        return (0, 0); 
    } 
    

    (2)를 얻을 (i32 및 발 usize로 변환) 한 결과 역 참조. map.get(&a)map 블록의 기간 동안 map을 빌려 때문에 또한 그것으로 삽입 할 수 있도록

    그러나이 아직 작동하지 않습니다. 회전은 이러한 match 후 블록의 삽입 이동에 의해 해결된다 : 다야

    fn two_sum(nums: &Vec<i32>, target: i32) -> (usize, usize) { 
        let mut map = HashMap::new(); 
        for (i, x) in nums.iter().enumerate() { 
          let a = target - x; 
          match map.get(&a) { 
           Some(k) => return (*k as usize, i), 
           None =>(), 
          }; 
          map.insert(x, i); 
        } 
        return (0, 0); 
    } 
    

    한다. 프리미티브 유형이있는 Hashmap

    일부 다른 언어와 달리 원시 유형은 녹의 다른 유형과 거의 구별되지 않습니다.