2013-03-12 2 views
3

안녕 HashMap<String, Double> 그리고 answer로 알려진 이중 값을 반환하는 함수가 있습니다. HashMap의 어느 값이 가장 가까운 값인지 확인한 다음 그 값의 키를 가져 와서 인쇄하고 싶습니다. 자바 - 해시 맵에서 특정 숫자와 가장 가까운 값을 찾는 방법은 무엇입니까?

HashMap<String, Double> output = new HashMap<String, Double>(); 


contents 
("A", 0) 
("B", 0.25) 
("C", 0.5) 
("D", 0.75) 
("E", 1) 

는 나는 그것이 가장 가까운 가치있는 확인하고 그 값으로 키를 잡아 수있는 방법, 내 기능 중 하나에 대한 답은 0.42이었다 가정하자. 나는 HashMap의 키와 값을 전환 할 수 없다. (이전 함수는 각 문자에 값을 똑같이 할당한다.) 그렇지 않으면 각 키를 거쳐 값을 얻는 것이 낫다.

+0

기본적으로 할 수 없습니다. 데이터를 추출하여 다른 방법으로 검사해야합니다. 해시 맵은 항목을 특정 순서로 두지 않습니다 (사실은 순서를 무작위로 지정합니다). –

답변

4

HashMap으로 각 입력을 거쳐야합니다.

그러나 성능이 중요 할 경우 등 여러 가지 항목을 찾을 수 있습니다. 해시지도에서 항목 또는 값의 배열로 구성된 목록 또는 목록을 다른 모음으로 만들 수 있습니다. 그런 다음 이진 검색을 수행하여 가장 가까운 값을 가진 항목을보다 효율적으로 찾고 해당 키를 반환 할 수 있습니다. 물론지도 당 한 번만이 작업을 수행하면 도움이되지 않습니다 ...

0

'가장 가까운'개념은 해시 데이터 구조에 실제로 의미가 없습니다. 효율적인 해싱 알고리즘의 기본 목표는 근접성에 직접적으로 반대되는 충돌 회피입니다. 충돌이 있었는지 아닌지.

주문한 키 데이터 구조 (예 : TreeMap)를 묻는 경우 대답이 달라집니다.

0

HashMap이이를 수행하는 데 가장 좋은 구조는 아닙니다. 당신은 output.keySet을 (수) 각각의 값을 확인, 예를 들어 수 있습니다

for(String key:output.keySet()){ 
    Double temp=Math.abs(output.get(key)-answer); 
    if(temp<min){ 
    min=temp; 
    nearest=key; 
    } 
} 

을하지만 가장 좋은 방법이 아니다. 해시 맵을 사용해야합니까? 당신이 확인 항상 다섯 답 ... 당신의 값이 고유 경우

+0

나는 항상 확인 응답의 숫자를 가질 것이다 – Matt9Atkins

+0

좋다. 고정 숫자가 작은 경우 문제없이이 코드를 사용할 수 있습니다.) –

+0

각 키에 대해 keySet() 및 get()을 사용하는 대신 entrySet()을 사용하십시오! –

8

, 당신은 좋은 ceilingKeyfloorKey 방법이있다 NavigableMap를 구현하는 TreeMap, 사용할 수있는 경우 그런데 ,이 문제가되지 않습니다 :

NavigableMap<Double, String> map = new TreeMap<>(); 
    map.put(0d, "A"); 
    map.put(0.25, "B"); 
    map.put(0.5, "C"); 
    map.put(0.75, "D"); 
    map.put(1d, "E"); 

    double value = 0.42; 
    double above = map.ceilingKey(value); 
    double below = map.floorKey(value); 

    System.out.println(value - below > above - value ? above : below); //prints 0.5 

참고 : value가 작은 경우 두 방법 모두 null을 반환 할 수있는 작은/큰 키가 아닌 (RESP보다.).

관련 문제