2014-03-12 7 views
1

지도가 Map<String, Integer>입니다. 정렬 후에 값을 정렬하고 첫 번째 값의 키를 검색해야합니다.값에서 java.util.map의 키를 얻는 방법

나는과 같은 작업을 수행했습니다. 이제 값이 정렬됩니다. 정렬 된 값의 첫 번째 요소의 키는 어떻게 가져올 수 있습니까?

나는 이것을 달성하는 더 좋은 방법을 환영 할 것이다.

+0

어떻게 당신이 * 값이 * 하나 이상의 * 키 * 매핑되는 경우를 처리 하시겠습니까? 지도에서 키는 고유하지만 값은 보장되지 않습니다. – vegemite4me

답변

-1

Map.entrySet()을 사용하면 키와 함께 값이 포함됩니다.

+2

하지만지도에서 가져온 값이 정렬되기 때문에 어떤 값이 첫 번째 값의 키인지 구분할 수 없습니다. – eis

+0

당신은 같은 가치를 구별 할 수 없지만, 그렇다고해서 당신이 가치를 찾을 때까지 집합을 반복 할 수 있습니다! – kutschkem

-1
Map<String, Integer> map = new HashMap<String, Integer>(); 
for (Map.Entry<String, Integer> entry : map.entrySet()) { 
    // do your sorting 
} 
// fetch the first entry here 
entry.getKey(); 
+0

OP는 왜 루프에서 정렬합니까? – eis

+0

이것은 Map.Entry를 사용하는 예제 일뿐입니다. 그 밖의 모든 것은 중요하지 않으며 여기서는 예제 만 보여줍니다. – Harmlezz

2

당신은 TreeSet<Map.Entry>보다는 TreeSet<Integer> (기존 맵에서 entrySet로 충전), 그리고 Comparator<Map.Entry>를 사용하는 것이 좋습니다. 그런 다음 Comparator<Map.Entry> 구현에서 값을 기준으로 비교하십시오. 그런 다음 키와 값이 서로 연관되어 있습니다.

+0

'TreeSet'의 생성자가 오직 하나를 취할 수 있기 때문에 어떻게'Comparator '와'entrySet()'을 동시에 사용합니까? –

+0

@erictesting : 비교 자로 구성한 다음 향상된 'for' 루프에서 반복적으로'entrySet '에서 추가합니다. 예 : (건설 후)'for (Map.Entry entry : originalMap.entrySet()) {treeSet.add (entry); }' –

0

귀하의 요구 사항은 잘못 정의되어 있습니다. 두 개의 키가 동일한 값으로 매핑되는 경우 - 둘 중 어느 키를 검색해야합니까?

당신이 가진지도에서 주어진 최선의 결과는 values()이 아닌 entrySet()을 사용하는 것입니다. 그런 다음 Entry 개체를 값순으로 정렬하고 적절한 키를 검색 할 수 있습니다.

그러나 Map을 먼저 "반대 방향"으로 유지하는 것이 훨씬 쉬울 것입니다. 첫 번째 데이터를 채우는 것과 동시에이 데이터를 채우는 경우 두 번째 Map을 사용하여 '값'에서 '키'를 빠르게 검색 할 수 있습니다. 이런 식으로 뭔가 :

Map<String, Integer> originalMap = new HashMap<String, Integer>(); 
Map<Integer, String> reverseLookup = new HashMap<Integer, String>(); 
// Populate both maps at the same time, with the same data (but reversed)... 

for (Integer i : originalMap.values()) { 
    System.out.println(reverseLookup.get(i)); 
} 
0

어떻게 정렬 된 값의 첫 번째 요소의 키를받을 수 있나요.

가장 효율적인 방법은 아니지만이 방법을 정렬 된 Set의 첫 번째 요소와 함께 호출 할 수 있습니다. 이 방법은 Map에 null이 아닌 값이 있다고 가정합니다.

private String getKeyForValue(Integer value, Map<String, Integer> map) { 
    for (Map.Entry<String, Integer> entry : map.entrySet()) { 
     if (entry.getValue() == value) { 
      return entry.getKey(); 
     } 
    } 
    throw new IllegalArgumentException("The value " + value + " was not found in the map."); 
} 
0
Map<String, Integer> map = new HashMap<String,Integer>(); 
Set<Integer> set = new TreeSet<Integer>(map.values()); 

Iterator iter = set.iterator(); 

Integer firstValue = (Integer) iter.next(); 
String firstKey = null; 
for(String key : map.keySet()) 
{ 
    if(map.get(key) == firstValue) 
    { 
    firstKey = key; 
    break; 
    } 
} 
관련 문제