2013-10-12 2 views
2

이 문제는 문제가 있습니다. 문자열 목록을 매개 변수로 허용하는 contains3 메서드를 작성하고 하나의 문자열이 목록에서 적어도 3 회 발생하면 true를 반환하고 그렇지 않으면 false. 지도를 사용해야합니다.목록에서 여러 값 검색

단어의 인스턴스가 세 개인 경우에도 여전히 true를 반환하지 않습니다. 문제가 발생한 곳을 찾는 데 문제가 있습니다.

private static boolean contains3(List<String> thing) { 
    Map<String, Integer> wordCount = new TreeMap<String, Integer>(); 
    for (String s: thing) { 
     String word = s; 

     if (wordCount.containsKey(word)) { // seen before. 
      int count = wordCount.get(word); 
      wordCount.put(word, count + 1); 
     } else { 
      wordCount.put(word, 1); // never seen before. 
     } 

     if (wordCount.containsValue(3)) { 
      return true; 
     } else { 
      return false; 
     } 

    } 
    return false; 
} 
+1

무엇이 문제입니까? – Prateek

+0

단어의 인스턴스가 세 개인 경우에도 여전히 true를 반환하지 않습니다. 문제가 발생한 곳을 찾는 데 문제가 있습니다. –

+0

@JackL. 콜렉션에서 원시 메소드를 사용할 수 없습니까? –

답변

3

문제는 여기에 있습니다 : :

if (wordCount.containsValue(3)) { 
    //... 

당신은 word 당신이 계산하고, 즉, 키를 사용하여 값을 얻어야한다 여기

내가 가진 것입니다. 이 첫 번째 반복의 방법을 파괴하기 때문에 나는이 if 문에서 return false;을 제거

if (wordCount.get(word) >= 3) { 
    return true; 
} 

참고.


제안으로, 당신은 HashMap 대신 TreeMap에이 HashMapputget 이후 당신의 방법의 성능을 향상 사용할 수 있습니다 TreeMap 년대는 O (1) (일정 시간) 동안이다 O (log n).

+0

또한'HashMap'은'TreeMap'보다는 오히려 올바른 선택입니다. (정렬이 필요 없기 때문에 더 효율적입니다.) – MattR

+0

@MattR 제안을 언급했습니다. 감사합니다. –

+0

알겠습니다. 고마워요. –

1

각 단어를 추가 할 때이 코드를 실행하는 : 첫 번째 단어를 추가 할 때

 if (wordCount.containsValue(3)) { 
      return true; 
     } else { 
      return false; 

시험은 실패하고 즉시 false를 반환 할 것입니다. 블록의 끝까지 이동하여 현재 단어가 모두 카운트 된 경우에만 확인을 수행하는 return false의 최종 행에 추가합니다.

2

다음 코드를 사용해보십시오.

private static boolean contains3(List<String> thing) { 
    Map<String, Integer> wordCount = new TreeMap<String, Integer>(); 
     thing.add("hi"); 
     thing.add("hi"); 
     thing.add("hi"); 
     thing.add("hia"); 
     thing.add("hi3"); 
     for (String s: thing) { 
      String word = s; 

      if (wordCount.containsKey(word)) { // seen before. 
       int count = wordCount.get(word); 
       wordCount.put(word, count + 1); 
      } else { 
       wordCount.put(word, 1); // never seen before. 
      } 
     } 
      if (wordCount.containsValue(3)) { 
       return true; 
      } else { 
      return false;} 
1

그것은 만약 카운트가 초기에> = 3인지 확인하는 것이 훨씬 더 효율적이다 루프

0

위해 외부

if (wordCount.containsValue(3)) { 
     return true; 
    } else { 
     return false; 
    } 

넣어 블록

if (wordCount.containsKey(word)) { // seen before. 
     int count = wordCount.get(word) + 1; 
     if(count >= 3) { 
       return true; 
     } 
     wordCount.put(word, count); 
    } 

제거 다음 경우 else 블록

if (wordCount.containsValue(3)) { 
     return true; 
    } else { 
     return false; 
    }