2014-02-24 4 views
1

"텍스트"개체를 키로, "정수"개체를 값으로 사용하는 HaspMap이 있습니다. 값은 실제로 내 코드에서 키의 발생 횟수입니다. 그래서 처음으로 1이 될 것이고 계속 증가 할 것입니다. 아래에 코드가 나와 있습니다.새 키 값 쌍 추가 Java HashMap의 모든 값 대체

먼저 주어진 "텍스트"개체가지도에 있는지 확인합니다. 그렇지 않다면 값 1과 함께지도의 키로 추가합니다. 그러나 내가 직면하고있는 문제는 어떤 이유로 모든 "put"함수를 통해지도에 새 키와 값을 추가하면 맵에있는 이전에 존재하는 키/값 쌍이 새로운 것으로 대체됩니다. 코드는 아래와 같습니다.

그래서 기존의 키가 항상 else 문으로 이동했는지 확인합니다. 그러나 가치가 대체되고 있습니다. 출력 콘솔에서 나는 다음과 같은 출력을 얻고있다.

The new val outside isWelcome 
Welcome 
{Welcome=1} 
The new val outside isservice service 
{service=1, service=1} 
The new val outside isversions  versions 
{versions=1, versions=1, versions=1} 
The new val outside isto 
to 
{to=1, to=1, to=1, to=1} 
The new val outside isproviders, 
providers, 
{providers,=1, providers,=1, providers,=1, providers,=1, providers,=1} 
The new val outside isof of 
{of=1, of=1, of=1, of=1, of=1, of=1} 
The new val outside isthe the 
{the=1, the=1, the=1, the=1, the=1, the=1, the=1} 
The new val outside issome some 
{some=1, some=1, some=1, some=1, some=1, some=1, some=1, some=1} 

등등 ..

나는 이것을 원하지 않는다. 이전 키를 유지하는 새로운 키 값 쌍을 추가하기 만하면됩니다. 누군가 내가 잘못한 것을 알려주시겠습니까? 미리 감사드립니다.

+1

텍스트가 equals/hashCode를 구현 했습니까? http://stackoverflow.com/questions/18032172/why-java-uses-equals-instead-of-to-check-an-objects-presence-in-a-map/18032235#18032235 –

+0

이 애플리케이션의 경우 대신 Google Guava의 'Multiset'을 고려해야합니다. 그것은 개체 계산을위한 특수 컬렉션입니다. – chrylis

답변

0

지도에 newval에 대한 참조를 저장하고 있습니다. containsKey (newval)는 Text가 내용이 같은지 확인하기 위해 Text가 검사하기 때문에 false를 검사하지만, put 호출은 사용자가 맵에 반복적으로 넣은 동일한 newval (가장 최근에 읽은 문자열 만 포함)에 대한 참조를 저장합니다. 지도를 String, Int의지도로 변경하고 map.put (newval.toString())을 호출하여 시작하는 것이 더 나은 해결책으로 이어질 것입니다. 그렇지 않으면 iterator 루프 내에서 newval을 선언하여 매번 map에 새 Text 객체를 저장합니다 (Text newval = it.next()).

+0

그게 효과가 있습니다. 텍스트는 변경 불가능한 개체입니다. 개체를 String으로 변경하고 작업을 시작했습니다. – user3331114

0

어떤 클래스가 Text입니까?

가설 1 : Textequals()hashCode()according to the contract 구현하지 않습니다. 그게지도를 망칠거야.

가설 2 : Text은 반복 중에 변경 가능하며 변경됩니다. 지도에서 문자열 키를 사용하면 문제가 해결됩니다.

+0

여기에있는 기본 질문은 "내 프로그램을 어떻게 디버깅 할 수 있습니까?"입니다. 일반적인 대답은 증상을 설명 할 수있는 가설을 생각한 다음 가설을 테스트하는 것입니다. 또한 가정 된 문제가 일으키는 다른 증상이 무엇인지 물어보십시오. – Jerry101

0

Text 값이 가변적 인 것 같습니다. Iterable values 개체의 구현은 무엇입니까? 동일한 토큰 인스턴스를 반복적으로 반환하는 구문 분석기입니까? next()을 호출 할 때마다 해당 형식과 텍스트가 수정됩니까? 그렇다면 텍스트를 새로운 불변 ​​개체 — (단순하게 String — 일 수 있음)에 복사하고 해당 불변 토큰을 키로 사용해야합니다.

+0

위 코드는 Hadoop Map reduce 프로그램의 Reducer 코드입니다. 반복 가능한 값은 Java 코드 중 하나입니다. – user3331114