2015-05-14 4 views
0

Я пытаюсь решить задачу программирования, описанную ниже, в которой в основном вам нужно найти слово в данном предложении с наибольшим количеством повторяющихся символов. Я немного потрудился с этим, и мне посчастливилось найти код для подсчета появления букв в строке (также ниже). Этот конкретный кусок кода хранит все буквы в HashMap, и мне нужно адаптировать его так, чтобы он сохранял появление символа каждого слова отдельно (а не в совокупности, как это делается на данный момент). Вот где я застрял. Что я могу использовать для хранения состояния HashMap с каждой итерацией цикла?Сохранение значений hashmap как итераций программы

/* Using the Java language, have the function LetterCountI(str) take 
* the str parameter being passed and return the first word with the 
* greatest number of repeated letters. For example: "Today, is the 
* greatest day ever!" should return greatest because it has 2 e's 
* (and 2 t's) and it comes before ever which also has 2 e's. If there 
* are no words with repeating letters return -1. Words will be 
* separated by spaces. */ 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Map; 

public class OtherCountLetters { 
    void countLetters2(String str) { 
     String[] words = str.toLowerCase().split(" "); 
     Map<Character, Integer> numChars = new HashMap<Character, Integer>(); 

     for (int i = 0; i < words.length; i++) { 
      for (int j = 0; j < words[i].length(); j++) { 
       char charAt = words[i].charAt(j); 

       if (!numChars.containsKey(charAt)) { 
        numChars.put(charAt, 1); 
       } else { 
        numChars.put(charAt, numChars.get(charAt) + 1); 
       } 
      } 

     } 

     System.out.println(numChars); 
    } 

    public static void main(String[] args) { 
     OtherCountLetters ocl = new OtherCountLetters(); 
     ocl.countLetters2("Today is the greatest day ever"); 
    } 

} 

На данный момент для предложения «сегодня величайший день когда-либо», программа возвращает

{v=1, g=1, d=2, e=5, t=4, s=2, r=2, a=3, o=1, h=1, y=2, i=1} 

Но мне нужно, чтобы вернуть что-то вроде

{a=1, d=1, o=1, t=1, y=1} //'today' 
{i=1, s=1}    //'is' 
{e=1, h=1, t=1}   //'the' 
{g=1, t=2, e=2, s=1, r=1, a=1} //'greatest' 
{d=1, a=1, y=1}   //'day' 
{v=1, e=2, r=1}   //'ever' 

этак , Я мог бы перебирать каждую запись, чтобы увидеть, какое из них имеет наибольшее значение, а затем вернуть соответствующее слово пользователю.

Спасибо,

----- EDIT ----

После размещения этого я имел Эврика момент:

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Map; 

public class OtherCountLetters { 
    void countLetters2(String str) { 
     String[] words = str.toLowerCase().split(" "); 
     String target = null; 
     int largest = 0; 
     Map<Character, Integer> numChars = new HashMap<Character, Integer>(); 

     for (int i = 0; i < words.length; i++) { 
      for (int j = 0; j < words[i].length(); j++) { 
       char charAt = words[i].charAt(j); 

       if (!numChars.containsKey(charAt)) { 
        numChars.put(charAt, 1); 
       } else { 
        numChars.put(charAt, numChars.get(charAt) + 1); 
       } 
       if (numChars.get(charAt) > largest) { 
        largest = numChars.get(charAt); 
        target = words[i]; 
       } 
      } 
      numChars.clear(); 
     } 
     if (largest != 1) { 
      System.out.println(target); 
     } else { 
      System.out.println("there are no words with 2 or more letters"); 
     } 
    } 

    public static void main(String[] args) { 
     OtherCountLetters ocl = new OtherCountLetters(); 
     ocl.countLetters2("today is the greatest day ever and car"); 
    } 

} 

ответ

0

есть вы считаете, чтобы разделить вашу фразу в слова, а затем повторять каждое слово, используя ваш метод «OtherCountLetters»?

вместо того, чтобы ничего не возвращать, просто верните самый высокий балл повторного символа. Затем в цикле, вы просто должны сравнить его с текущим максимальным

В конце цикла, вы можете быть в состоянии дать слово фразы с самым высоким многократном характером

0

Оно должно быть:

public class OtherCountLetters { 
    void countLetters2(String str) { 
     Map<Character, Integer> numChars = new HashMap<Character, Integer>(); 
     for (int j = 0; j < str.length(); j++) { 
      char charAt = str.charAt(j); 

      if (!numChars.containsKey(charAt)) { 
       numChars.put(charAt, 1); 
      } else { 
       numChars.put(charAt, numChars.get(charAt) + 1); 
      } 
     } 

     System.out.println(numChars); 
    } 

    public static void main(String[] args) { 
     OtherCountLetters ocl = new OtherCountLetters(); 
     String[] words = "Today is the greatest day ever".toLowerCase().split(" "); 
     for (int i = 0; i < words.length; i++) { 
      ocl.countLetters2(words[i]); 
     } 
    } 

} 
0

Ну почему вы получаете вывод, что вы, что вы используете один HashMap для хранения всех ваших слов в нем. Вы отлично справились с расщеплением слов предложения в массив, и вы перебираете их точно так, как должны; однако в конце дня вы храните буквы в одной хеш-таблице, которая смешивает какое слово в предложении имеет что.

Что бы я сделал, это изменить свое решение, сделав функцию, которая принимает слово, и возвращает целое число, которое является числом повторений наиболее частого письма, а затем выполняет эту функцию для каждого слова в предложении. Тогда вы можете сравнить, какое слово имеет наибольшее число.

Надеюсь, это помогло. Я не хотел давать вам код, чтобы исправить ваше решение по очевидным причинам. (не хотел лишить вас аха-моментов.)

Cheers, Andrew malta