2011-03-16 3 views
2

해시 맵에서 k, v 쌍을 검색하려고합니다. 항목은 다음과 같습니다 :반복적 인 반복 해시맵

a = 3,4 
b = 5,6 

등등. 이 값들의 조합이 필요합니다.

a=3, b=5. 
a=3, b=6. 
a=4, b=5. 
a=4, b=6. 

값이 몇 개의 키와 얼마나 많은 항목인지 알 수 없습니다. entryset와 나는 값을 얻을 수 있지만 조합을 얻을 수 없습니다. 그것은 재귀처럼 보이지만 어떻게? 당신이 정말 MultiMap을 원하는처럼

HashMap<String, String[]> map = new HashMap<String, String[]>(); 

BufferedReader file = new BufferedReader(new FileReader("test.txt")); 
String str; 


while ((str = file.readLine()) != null) { 


    ... logic 


    map.put(key, value); 



} 
System.out.println("number of keys: " + map.size()); 
for(Entry<String, String[]> entry : map.entrySet()) { 
    for(String value : entry.getValue()) { 
     System.out.println(entry.getKey() + ": " + value); 
    } 
} 
file.close(); 
+0

"나는"당신의 키 "a"(귀하의 목록에서) 귀하의 가치, 또는 "3"귀하의 키와 a에서 "5"귀하의 b 값에서? –

+0

a가 키이고, 3과 4가 문자열입니다. 그러므로 "String []". 값은 String [] – zyamat

답변

0

그것은 나에게 같습니다

여기 내 코드입니다.

ArrayListMultimap<String, String> map = ArrayListMultimap.create(); 

for each line in file: 
    parse key k 
    for each value in line: 
     parse value v 
     map.put(k, v); 

for (Map.Entry<String,String> entry : map.entries()) { 
    String key = entry.getKey(); 
    String value = entry.getValue(); 
} 

당신이지도의 카티 제품을 원하는 경우에, 당신이 직접 사용하여 재귀를 계산할 수있다, 또는 당신이지도를 반복 수 : 반복자 및 반복 처리의 목록을 만들 특히, ArrayListMultimap 중복 된 항목 수 주행 거리 - 스타일; 반복자 N이 끝나면 반복자 N + 1을 진행하고 반복자 1을 다시 설정합니다.


그냥 주위를 찌르고이 SO 질문 발견

Iterative Cartesian Product in Java 그래서 난 당신이 직교 제품에 대한 구아바의 Sets.cartesianProduct를 사용하는 것이 좋습니다 것입니다.

String key1 = "a"; 
    Set<Integer> values1 = Sets.newLinkedHashSet(Arrays.asList(1, 2, 3, 4)); 
    String key2 = "b"; 
    Set<Integer> values2 = Sets.newLinkedHashSet(Arrays.asList(5, 6, 7)); 
    String key3 = "c"; 
    Set<Integer> values3 = Sets.newLinkedHashSet(Arrays.asList(8, 9)); 

    List<String> keys = Arrays.asList(key1, key2, key3); 
    Set<List<Integer>> product = Sets.cartesianProduct(values1, values2, values3); 
    for (List<Integer> values : product) { 
     for (int i = 0; i < keys.size(); ++i) { 
      String key = keys.get(i); 
      int value = values.get(i); 
      System.out.print(key + "=" + value + "; "); 
     } 
     System.out.println(); 
    } 
+0

입니다. 중복 항목을 원하지 않습니다. 난 단지 모든 k, v- 조합을 원해. 나는 가치가 무엇인지 염려하지 않는다. – zyamat

+0

'HashMultimap'은 중복 된 항목을 방지합니다. 그러나 나는 아직도 당신의 목표에 대해 분명하지 않습니다. –

+0

좋습니다. 나는 텍스트 입력을 얻는다. 이것은지도에 도착합니다. 열쇠는 무엇입니까? 값은 String []에 저장됩니다. 나중에 값이 별도의 문자열로 필요합니다. 그래서 그것은 단지 문자열이 아니라 String []입니다. 첫 번째 게시물과 마찬가지로 키 - 값 쌍의 모든 조합이 필요합니다. – zyamat

5

다음과 같은 코드를 시도 할 수 있습니다 : 메모리 효율성이나 속도에

public void mapPermute(Map<String, String[]> map, String currentPermutation) { 
    String key = map.keySet().iterator().next(); // get the topmost key 

    // base case 
    if (map.size() == 1) {   
     for (String value : map.get(key)) { 
      System.out.println(currentPermutation + key + "=" + value); 
     } 
    } else { 
     // recursive case 
     Map<String, String[]> subMap = new HashMap<String, String[]>(map); 

     for (String value : subMap.remove(key)) { 
      mapPermute(subMap, currentPermutation + key + "=" + value + ", "); 
     } 
    } 
} 

보장을 다음은 입력 로직에 적응하지 수있는 코드 주위에 내 파고,이다. 지도에서 키의 순서를 유지하려면 TreeMap을 전달하고 재귀 적 경우에 TreeMap을 사용하도록 코드를 변경해야합니다.

기본 사례에서 알 수 있듯이지도에 하나 이상의 항목이 있다고 가정합니다.

+0

이것은 절대적으로 완벽합니다! 의도 한대로 작동합니다!대단히 감사합니다! – zyamat

관련 문제