Не могу получить цикл for, чтобы дать мне наименее распространенную букву из моей хэш-карты

У меня все работает, за исключением того, что я не могу понять, почему мой код не находит наименее распространенную букву. У меня есть цикл for, который должен находить наименее распространенную букву, но он мне ничего не дает. он дает мне наиболее распространенные, но не менее важные.

    FileReader file = new FileReader("\\src\\alphaCounter\\");
    BufferedReader reader = new BufferedReader(file);

    HashMap<Character,Integer> myHashSet = new HashMap<Character, Integer>();

    myHashSet.put('a', 0);
    /** this goes to Z


    int mostCommon = 0;
    char mostCommonLtr = ' ';
    int leastCommont = 0;
    char leastCommonLtr = ' ';



    Object[] words = reader.lines().toArray();

    /**
     * this loop has changed all the letters to lower case
     */
    for(Object word : words){
        String wordString = word.toString();
        wordString = wordString.toLowerCase();
        /**
         * 
         */
        if (wordString.length() > bigWord.length()){
            bigWord = wordString;
        }    
        for(int alpha = 0; alpha < wordString.length(); alpha++){
            myHashSet.put(wordString.charAt(alpha), myHashSet.get(wordString.charAt(alpha)) + 1);
        }

    }

            for(int alpha = 'a'; alpha<= 'z'; alpha++){
        System.out.println("The number of " + (char)alpha +  "'s in the words.txt = " + myHashSet.get((char)alpha ));

        if (myHashSet.get((char)alpha) > mostCommon)  {
            mostCommonLtr = (char)alpha;
            mostCommon = myHashSet.get((char)alpha); 
            /**
             * this gave me the most common letter
             */


        if (myHashSet.get((char)alpha) < leastCommont)  {
            leastCommonLtr = (char)alpha;
            leastCommont = myHashSet.get((char)alpha);
            /**
             * this was supposed to give me the least common
             */
        }   
    }


    System.out.println("The letter that appeared the least is " + leastCommonLtr);  

    System.out.println("The letter that appears the most is " + mostCommonLtr); 

Как вы инициализируете leastCommont?

shmosel 22.03.2018 04:55

Опубликуйте образец ввода и ожидаемый фактический результат

user7 22.03.2018 04:57

мой код печатает это сообщение "Буква, которая появлялась меньше всего", по крайней мере, должна сказать мне j на основе моего файла

SirPounceAlot 22.03.2018 05:15
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
44
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Заменять

int leastCommont = 0;

С участием

int leastCommont = Integer.MAX_VALUE;

Причина

Если leastCommont инициализирован значением 0, следующее условие вашего кода никогда не выполняется:

if (myHashSet.get((char)alpha) < leastCommont)

@ Lock13B Если вы получили ответ на свой вопрос, не забудьте отметить вопрос как полученный, приняв ответ на него.

VHS 22.03.2018 05:25
Ответ принят как подходящий
  if (myHashSet.get((char)alpha) != null && myHashSet.get((char)alpha) > mostCommon)  {
                    mostCommonLtr = (char)alpha;
                    mostCommon = myHashSet.get((char)alpha); 
                    /**
                     * this gave me the most common letter
                     */
                } 

                if (myHashSet.get((char)alpha) != null && myHashSet.get((char)alpha) > leastCommont && alpha != mostCommonLtr )  {
                    leastCommonLtr = (char)alpha;
                    leastCommont = myHashSet.get((char)alpha);
                    /**
                     * this was supposed to give me the least common
                     */

            }

Попробуйте использовать приведенный выше фрагмент кода. У вас есть самое высокое и самое низкое в одном предложении if. нужно обращаться с этим по-другому. Судя по предыдущему коду, дело даже не доходило до наименее используемого символа.

Надеюсь, этот код вам поможет. Я сделал простой счетчик символов. Вы можете сделать функцию такой, какой хотите, используя это. Если вы хотите, чтобы регистр был безразличным, сделайте входную строку строчными или прописными.

    String wordString = "a1s3df2ad2fsa3dfwe3wrqasdf";
    System.out.println("input string = "+wordString) ;
    char[] cword = wordString.toCharArray();
    List<Character> mylist = new ArrayList<Character>();
    Set<Character> charset = new HashSet<Character>();
    HashMap<Character, Integer> myHashSet = new HashMap<Character, Integer>();

    int maxcnt, mincnt;
    for (char c : cword) {
        mylist.add(c);
        charset.add(c);
    }
    for (Character c : charset) {
        int freq= Collections.frequency(mylist, c) ;
        System.out.println("alpha " + c + " freq = "+freq );
        myHashSet.put(c, freq) ;
    }
    maxcnt = Collections.max(myHashSet.values()) ;
    mincnt = Collections.min(myHashSet.values()) ;
    System.out.println("maxcnt = "+maxcnt+" mincnt = "+mincnt) ;

    // get max alpha
    System.out.print("max count alphas: ") ;
    for (Character c : charset ) {
        if ( maxcnt == myHashSet.get(c).intValue() ) {
            System.out.print(" "+c);
        }
    }
    System.out.println("") ;
    // get min alpha
    System.out.print("min count alphas: ") ;
    for (Character c : charset ) {
        if ( mincnt == myHashSet.get(c).intValue() ) {
            System.out.print(" "+c);
        }
    }
    System.out.println("") ;

вывод образца

input string=a1s3df2ad2fsa3dfwe3wrqasdf
alpha a freq=4
alpha 1 freq=1
alpha q freq=1
alpha 2 freq=2
alpha r freq=1
alpha s freq=3
alpha 3 freq=3
alpha d freq=4
alpha e freq=1
alpha f freq=4
alpha w freq=2
maxcnt=4 mincnt=1
max count alphas:  a d f
min count alphas:  1 q r e

Другие вопросы по теме