2013-10-12 5 views
2

У меня возникают проблемы с этой проблемой: я должен написать метод contains3, который принимает список строк в качестве параметра и возвращает true, если какая-либо одна строка встречается не менее 3 раз в списке, и 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 (wordCount.get(word) >= 3) { 
    return true; 
} 

Обратите внимание, что я удалил return false; из этого if заявления, так как он сломается метод в первой итерации.


Как предложение, вы можете использовать HashMap вместо TreeMap для повышения производительности вашего метода с put и get времени в HashMap является O (1) (постоянное время), а TreeMap «s является 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

поставил

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

вне для цикла

0

Это гораздо более эффективным, чтобы проверить, если счетчик находится в начальном> = 3, если блок

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; 
    } 
Смежные вопросы