计算字符串中的字母

时间:2017-11-18 20:05:17

标签: java count

我需要找到一个算法来计算任何字符串中的字母(例如“cabababb”),输出必须按字母顺序排列(例如a:3,b:4,c:1等)。无需区分大写和小写字母。我不被允许你使用HashMap。

这是我的代码,直到现在:我没有工作,我想我在这里有错误的策略。你能帮帮我吗?

public class Stringray extends MiniJava{
public static void main(String[] args) {
    // Texteingabe
    String input = readString("Geben Sie einen Text ein: ");

    String output = "";
    int i = 0;

    // Häufigkeit der Buchstaben
    int count = 0;
    char letter = 'a';
    while(i < input.length()) {
            while(i < input.length()) {
                if(input.charAt(i) == letter) {
                    while(i < input.length()) {
                        count++;
                        i++;
                    }
                    output = output + letter + ": " + count + "\t";
                }
                i++;
            }
            letter++;
    }
    write(output);
}
}

7 个答案:

答案 0 :(得分:2)

这是一个简单的算法:

  1. 创建一个长度为int[]的空26数组,它将使用0 s进行初始化
  2. 迭代你的字符串
  3. 获取当前索引的char
  4. 棘手的部分:您需要在给定的char及其相应的索引之间进行映射(例如a将是索引0b将是索引1 } 等等)。看看这个
  5. 的ASCII表
  6. 在创建的数组的映射索引处向元素添加1。
  7. 最后,迭代数组,只打印非0的值以及该索引处的相应char(此处再次需要ASCII映射)

答案 1 :(得分:1)

在线性时间内执行此操作的一种非常有效的方法是使用HashMap

public class Stringray extends MiniJava {

    public static void main(String[] args) {
        String input = "Geben Sie einen Text ein: ";
        System.out.println(countLetters(input));
    }

    public static HashMap<Character, Integer> countLetters(String input) {
        HashMap<Character, Integer> hashMap = new HashMap<>();
        final int length = input.length();
        for (int i = 0; i < length; i++) {
            Character currentChar = Character.toLowerCase(input.charAt(i));
            if (Character.isAlphabetic(currentChar)) {
                if (hashMap.containsKey(currentChar)) {
                    hashMap.put(currentChar, hashMap.get(currentChar) + 1);
                } else {
                    hashMap.put(currentChar, 1);
                }
            }
        }
        return hashMap;
    }

}

您需要考虑大写和小写相同并丢弃非字母字符。一旦掌握了hashmap中的所有信息,您显示控制台的方式就是另一回事。如果你需要为文本中不存在的字母显示零,那么最好将hashmap初始化为。

答案 2 :(得分:1)

我不确定这是否是一个棘手的问题。但实际上你需要做的就是创建一个计算String中字符出现次数的方法。下面的代码如何做到这一点是最简单的方法。我留给你修改它,使它适合你所有的测试用例。

public static void main(String[] args)
{
    String input = "cabababb";
    char[] testCharacters = new char[] { 'a', 'b', 'c' };
    for (int i = 0; i < testCharacters.length; i++)
    {
        System.out.println(testCharacters[i] + " occurs " + countOccurencesOf(testCharacters[i], input));
    }
}

public static int countOccurencesOf(char aCharacter, String inThisString)
{
    int count = 0;
    for (int i = 0; i < inThisString.length(); i++)
    {
        if (aCharacter == inThisString.charAt(i)) { count++; }
    }
    return count;
}

答案 3 :(得分:1)

我为你准备了一个炭泡泡排序。使用内置的排序方法,还有其他方法可以用更少的代码完成此操作,但是这个方法显示了数组排序的工作方式。

这不会考虑大写和小写字母会改变它们的数字Unicode值,但这会让你朝着正确的方向前进。

    public static void main(String[] args) {

    char[] str = "cabababb".toCharArray(); //Turn your string into an array

    int n = str.length; //get the length of the array
    char temp; //a temporary character holder
    for (int i = 0; i < n; i++) {
        for (int j = 1; j < (n - i); j++) {
            int compare = Character.getNumericValue(str[j - 1]);//get the numeric value of the char
            int compareTo = Character.getNumericValue(str[j]); //etc
            if (compare > compareTo) {//do a compare
                //swap elements  
                temp = str[j - 1]; //bubble sort
                str[j - 1] = str[j];
                str[j] = temp;
            }

        }
    }
    System.out.println(Arrays.toString(str));//You get your sorted array


}

冒泡排序背后的概念是这样的:

如果你的数组是[&#39; x&#39;,&#39; j&#39;]

如果前一个数组迭代大于当前数组迭代,这两个变量将进入带有注释//do a compare的if语句:

  1. 它会将之前的字符放入&#34; temp&#34;变量
  2. 然后它会用当前的char替换前一个char
  3. 最后,它会将当前的char作为前一个char(保存为&#34; temp&#34;)
  4. 回到这个例子:

      

    [&#39; X&#39;&#39; J&#39]

    if('x' > 'j'){//for example's sake **Not real code**
    //x is in 0 position
    //j is in 1 position
                    temp = 0 position's value; 
                    0 position's value = 1 position's value;
                    1 position's value = temp;
    }
    

    最后,您将获得一个按字母顺序排列的数组。

    如果你需要它回到一个字符串,你可以将它连接回一个字符串

    String newStr = "";
    
            for(char letter : str){
    
               newStr += letter;
    
            }
    
    
    
            System.out.println(newStr);
    

    我希望这有助于您理解Java中排序背后的概念

答案 4 :(得分:1)

您可以按照QBrute正确指出的以下步骤解决问题。

public String countMatches(String main) {
    //Create an array of the alphabets length
    main = main.toLowerCase();
    int[] foundArray = new int[26];
    String output = "";
    //Create an alphabets array
    String[] alphabets = "a b c d e f g h i j k l m n o p q r s t u v w x y z".split("\\s");
    //Split the main String array
    String[] mainArray = main.split("");
    for (String string : mainArray) {
        //Iterate through the array
        for (int i = 0; i < alphabets.length; i++) {
            //If the string index matches any of our alphabets
            if (string.equals(alphabets[i])) {
                //Increase the corresponding foundArray index value
                foundArray[i] = foundArray[i] + 1;
            }
        }
    }
    //Iterate through the foundArray
    for (int i = 0; i < foundArray.length; i++) {
        //If an index is greater than 0
        if (foundArray[i] > 0) {
            //A match was found
            //Assign the matched foundArray index to the corresponding alphabet
            output += alphabets[i] + ":" + foundArray[i] + ", ";
        }
    }
    return output;
}

答案 5 :(得分:0)

要求需要一些分析。

有一个非功能性要求不使用哈希映射。哈希映射只是一种以牺牲一点时间为代价来减少稀疏数据的存储需求的方法。它易于使用,但在Java中使代码更复杂一些。所以,直截了当的方法是使用数组。记忆很便宜,希望如此。

功能要求更成问题:

  • 信件: Unicode是Java使用的字符集,它确实有指定的字母Character.isLetter
  • 按字母顺序排列:语言学院和流行的惯例确定 The Alphabet 中的字母和字母的顺序是语言的各种书写系统。由于没有提到任何语言或文字,请在此基础上使用字符集的代码点排序(词典编纂)并报告每个字母。
  • 无需区分大写和小写字母:因为字母大小写是文化/语言环境特定的,所以单独查看每个字母并不尝试定义它会更直接套大写和小写字母。 (无论如何,还有更多的案例。)这似乎是一个选项,所以现在让我们跳过它。

int[] codepointCounts = new int[Character.MAX_CODE_POINT + 1]; // min to max, inclusive

String input = "Häufigkeit der Buchstaben";

for(int c : input.codePoints().toArray()){ 
    codepointCounts[c]++;       
}
for (int c = Character.MIN_CODE_POINT; c <= Character.MAX_CODE_POINT; c++) {
    if (codepointCounts[c] > 0) { 
        if (Character.isLetter(c)) {
            write(
                new String(Character.toChars(c)) + '\t' + 
                codepointCounts[c] + '\t' + 
                Character.getName(c));
        }
    }
}

答案 6 :(得分:0)

所以我完成了我的程序,控制台上没有任何内容 - 为什么???

我现在的代码如下所示:

public class Stringray extends MiniJava{
public static void main(String[] args) {

    // Text input
    String input = readString("Geben Sie einen Text ein: ");

    // Main menu
    int choose = readInt("Geben Sie 1 für Buchstabenanzahl, 2 für Buchstabenersetung und 3 für Wortspiegelung ein:");
    while(choose != 1 && choose != 2 && choose != 3) {
            write("Eingabe ungültig.");
            choose = readInt("Geben Sie 1 für die Häufigkeit der Buchstaben, 2 für Buchstabenersetung und 3 für Wortspiegelung ein:");
    }

    // Execute choice
    if(choose == 1) {
            countMatches(input);
    }if(choose == 2) {
            change(input);
    }
    String[] inPut = input.split(" ");
    reflect(inPut);    
}

// Count letters
public static String countMatches(String main) {
    int[] foundArray = new int[26];
    String output = "";
    String[] alphabets = "a b c d e f g h i j k l m n o p q r s t u v w x y z".split("\\s");
    for (String string : main.split("")) {
        for (int i = 0; i < alphabets.length; i++) {
            if (string.equals(alphabets[i])) {
                foundArray[i] = foundArray[i] + 1;
            }
        }
    }
    for (int i = 0; i < foundArray.length; i++) {
        if (foundArray[i] > 0) {
            output += " " + alphabets[i] + ":" + foundArray[i] + ", ";
        }
    }
    return(output);
}

// Replace letters
public static String change(String text) {
    write("Geben Sie zweimal nacheinander je einen Buchstaben ein.");
    String inputOne = readString("Erster Buchstabe:");
    String inputTwo = readString("Zweiter Buchstabe:");
    while(inputOne.length() != 1 || inputTwo.length() != 1) {
        write("Falsche Eingabe, bitte geben Sie zweimal nacheinander je einen Buchstaben ein.");
        inputOne = readString("Erster Buchstabe:");
        inputTwo = readString("Zweiter Buchstabe:");
    }
    int i = 0;
    char one = inputOne.charAt(0);
    char two = inputTwo.charAt(0);
    char input = text.charAt(i);
    while(i < text.length()) {
        if(input == one) {
            input = two;
        }
        i++;
    }
    String output = text;
    return(output);
}

// Mirror words
public static String[] reflect(String [] feld) {
    String[] reflect = new String [feld.length];
    int j = feld.length-1;
    for(int i = 0; i < feld.length; i++) {
        reflect[i] = feld[j];
        j--;
    }
    return reflect;
}

提前感谢您的大力帮助!