(Ошибка) вернуть неправильные значения после итерации списка - PullRequest
0 голосов
/ 17 мая 2019

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

Это работает правильно, если я введу строку в качестве ввода:

String text = "helllo";

так что это дает мне:

The most frequent letter is l with: 2 occurrences

и это правильно, но если я дам его в качестве ввода

String text = "abbccdd";

это дает мне

The most frequent letters are b,d with: 2 occurrences

и это не правильно, потому что это должно дать мне

The most frequent letters are b,c,d with: 2 occurences

пожалуйста, помогите!

BusinessLogic.java

package com.mycompany.showcharwithhighestoccurrence.javafxBusinessLogic;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class BusinessLogic {


    public void hello() {
        System.out.println("helllllo");
    }

    public String giveFinalResult(String text) {

        String input = " ";
        String output = " ";
        if (text != null) {

            input = text.toLowerCase().replaceAll("\\s+", "");

            int[] freq = new int[input.length()];
            int i, j, max, lastFreq;
            lastFreq = 0;

            //Converts given string into character array
            char inputChars[] = input.toCharArray();

            List<Character> maxChars = new ArrayList<>();

            //Count each word in given string and store in array freq
            for (i = 0; i < inputChars.length; i++) {
                freq[i] = 1;
                for (j = i + 1; j < inputChars.length; j++) {
                    if (inputChars[i] == inputChars[j] && inputChars[i] != ' ' && inputChars[i] != '0') {
                        freq[i]++;
                        inputChars[j] = '0';
                    }
                }
            }

            //Determine maximum occurring characters
            if (freq.length > 0) {
                lastFreq = freq[0];
            }
            for (i = 0; i < freq.length; i++) {

                max = freq[0];
                if (freq[i] == lastFreq) {
                    max = lastFreq;
                }
                if (max == lastFreq && max < freq[i]) {
                    lastFreq = freq[i];
                    maxChars.add(inputChars[i]);
                    for (Character c : maxChars) {
                        if (c != null) {
                            output = "The most frequent letter is " + c + " with: " + freq[i] + "occurrences";
                        }
                    }
                }
                if (lastFreq < freq[i]) {
                    maxChars.clear();
                    maxChars.add(inputChars[i]);
                    for (Character c : maxChars) {
                        if (c != null) {
                            output = "The most frequent letter is " + c + " with: " + freq[i] + "occurrences";
                        }
                    }
                }

                if (max > 1 && max == freq[i]) {
                    maxChars.add(inputChars[i]);
                        output = "The most frequent letter are " + maxChars.get(0).toString() + ", "
                                + iterator.next().toString() + " with: " + freq[i] + "occurrences";
                    }
                }
            }
        }

        return output;
    }
}

Ответы [ 2 ]

3 голосов
/ 17 мая 2019

Почему так сложно?

Вам просто нужно 3 простых шага:

    // collect frequencies
    Map<String, Long> collect = "abbccdde".chars()
            .mapToObj(c -> Character.toString((char) c))
            .collect(Collectors.groupingBy(x -> x, Collectors.counting()));

    // find max
    long max = collect.values().stream().max(Comparator.naturalOrder()).get();

    //filter values for max
    String result = collect.entrySet()
            .stream()
            .filter(x -> x.getValue() == max)
            .map(Map.Entry::getKey)
            .collect(Collectors.joining(","));

    String output = "The most frequent letter are " + result +  " with: " + max + "occurrences";

    System.out.println("output = " + output);
1 голос
/ 17 мая 2019

Полное переписывание:

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

public class Test {

    public static void main(String[] args) {
        System.out.println(giveFinalResult("hello"));
        System.out.println(giveFinalResult("abbccdd"));
        System.out.println(giveFinalResult("hello world!"));
    }

    public static String giveFinalResult(String text) {

        int maxFreq = 0;
        List<Character> listCharMaxFreq = new LinkedList<>(); 
        Map<Character, Integer> counts = new HashMap<>();

        // compute occurence of each characters
        for(char c : text.toCharArray()) { // prefer foreach loop
            Integer i = counts.get(c);
            if(i == null) { // character not yet met
                i = 1; // so 1
            } else {
                ++i; // otherwise, increment
            }
            counts.put(c, i); // save new count

            // keep trace of most occurred chars
            if(i >= maxFreq) {
                if(i > maxFreq) {
                    listCharMaxFreq.clear();
                }
                maxFreq = i;
                listCharMaxFreq.add(c);
            }

        }

        // construct output string
        StringBuilder sb = new StringBuilder();
        sb.append("In ")
        .append(text)
        .append(", the most frequent letter is ")
        .append(listCharMaxFreq)
        .append(" with ")
        .append(maxFreq)
        .append(" occurrences.");

        return sb.toString();
    }

}

Вам следует рассмотреть возможность разделения этого метода на две части.Сначала вычисляем и возвращаем список символов, которые встречаются чаще и встречаются.Во-вторых, построить выходную строку.Таким образом, вы можете легко использовать свой первый метод.

...