2017-04-03 2 views
0

힐스에 대한 데이터가 포함 된 CSV 파일에서 읽고 있습니다. 모든 읽기 등은 제대로 작동하지만 이제는 "카운티 이름"(파일의 열 머리글)을 연결하는지도를 만들고 싶습니다.) 그 안에 군 이름이있는 모든 언덕들과.지도 내의 Java 다중 집합

내 코드가 첫 번째 countyName에 대해 작동하기 때문에 올바른 경로를 따라 왔지만 문제는 for 루프 If 문이 else 문으로 이동하는 경우 기술적으로 다른 집합 (이전 값 삭제) 그리고 카운티 이름으로

내 출력을 새로운 언덕의 데이터를 할당하는 것은 :

{Perth and Kinross=[16,Knock of Crieff,Perth and Kinross,279.0,56.389329,-3.826973, 3,Creag Uchdag,Perth and Kinross,879.0,56.465278,-4.098107]} 

그래서 그것에서 "퍼스 및 킨 로스"모든 언덕이있다. 지도는

퍼스 및 킨 로스에 대해 저장된 값을 지우지 않고 다른 세트를 만드는 방법입니다에 대해 내가 확실 해요 무엇

{Perth and Kinross=[16,Knock of Crieff,Perth and Kinross,279.0,56.389329,-3.826973, 3,Creag Uchdag,Perth and Kinross,879.0,56.465278,-4.098107], Stirling=[7,Meall Buidhe,Stirling,719.0,56.419004,-4.308645]} 

처럼 끝나야한다 그래서 이제 내 옆에 카운티 이름은 예를 들어, "스털링"입니다

내 코드 :

Map<String, Set<Hill>> hillsByCounty = new HashMap<>(); 

     if (h.getCounty().equals(countyName)) { 
      hillsByCounty.get(countyName); 
      currentSet.add(h); 
      hillsByCounty.put(countyName, currentSet); 

     } else { 

      countyName = h.getCounty(); 
      currentSet.clear(); 
      currentSet.add(h); 

     } 
    } 

    return hillsByCounty; 
} 

정확히 어디가 잘못된 것입니다. 나는 그것이 명확한 기능이라는 느낌을 가지고 있지만 어떻게 해야할지 잘 모르겠습니다.

내 현재 코드는 출력한다 :

{Perth and Kinross=[7,Meall Buidhe,Stirling,719.0,56.419004,-4.308645], Stirling=[7,Meall Buidhe,Stirling,719.0,56.419004,-4.308645]} 

을 자사의 세트를 덮어 쓰기한다. 내 해결 방법은 무엇입니까?

+0

"왜이 코드가 작동하지 않습니까?" 질문의 종류는 주제와 관련이 없습니다. 디버거를 사용하여 오류를 찾거나 해결해야 할 구체적인 문제가있는 경우 다시 돌아 오십시오. – Vampire

+0

@Vampire 그게 아니라고 말하는 중이 야, 내 설정이 덮어 쓰여지고 있는지 궁금해. 내 코드가 편집 한 코드 스 니펫을 편집하고 추가했으며, 내가 원하는 것을 보여줍니다. 난 그냥 내 코드가 엉망이 어디 있는지 몰라 –

+1

물론, 그건 당신이 코드를 단계별로 오류가 어디에 있는지 볼 수있는 디버거입니다. 귀하의 코드 **는 ** 작동하지 않으며 이것은 고전적인 질문으로 여기에 게시해서는 안되지만 대신 디버거를 사용하십시오. 문제는 오히려 명백하기 때문에 나는 어쨌든 대답을 올렸지 만, "왜이 코드가 내가 기대하는 것처럼 작동하지 않는가"를 여기 게시하지 마십시오. 그들은 SO 규칙에 따라 주제를 벗어났습니다. – Vampire

답변

0

같은 세트를 다시 사용합니다. 따라서 카운티가 변경되면 세트를 지우고 다음 카운티와 함께 ​​기입하십시오. 대신 새로운 세트를 만들어야합니다. 같은 세트를 재사용하는 동안, 같은 세트를 재사용하고 비우고 그 안에 다른 것을 채 웁니다. hillsByCounty.put(...)은 세트를 복제하지 않고 참조 만 저장합니다.

+0

자 이제 새 세트를 만드는 방법을 알 수 있습니다. 분명히 100 개 이상의 카운티 이름이 포함 된 CSV 파일이기 때문에 새로운 세트를 만들면 2 세트 만 가질 수 있습니다. –

+0

왜 이렇게 생각하니? – Vampire

+0

글쎄, 내가 똑같은 세트를 재사용하고 그것을 비우고 다른 것으로 채우면, 모든 카운티 이름에 대해 새로운 세트가 없다면 총 결과가 같지 않을 것이라고 말하기 때문에 –

0

맵의 각 항목에 대한 값은 동일한 세트이므로 한 세트의 모든 수정 사항이 다른 항목에도 나타납니다. 루프 본문에있는 기존 집합을 확인할 수 있습니다.

for (Hill h : hills) { 
    Set<Hill> currentSet = hillsByCountry.get(h.getCountry()); 
    if (currentSet == null) { 
     currentSet = new HashSet<>(); 
     hillsByCountry.put(h.getCountry(), currentSet); 
    } 
    currentSet.add(h); 
} 
+0

기존 세트가 있는지 여부를 확인하고, 설정되어 있으면 새 세트를 만듭니다. –

+0

** 기존 세트가 ** 없다면 새 세트를 만듭니다; –