簡體   English   中英

JAVA-以字符串形式存儲字母和字母數

[英]JAVA - store letters and number of letters in string

我應該要求用戶輸入一個字符串,並且我應該解析該字符串並跟蹤字母的數字。 因此,就像用戶輸入字符串“ abee”一樣,它將輸出顯示為:

a: 1
b: 1
c: 0
e: 2

到目前為止,我已經能夠獲取字符串並將其解析並將元素存儲到數組中。 而且我能夠使用for循環一次打印出每個字母。 現在我面臨的問題是,當它打印出字母以及短語中存在多少個字母時,數字將不匹配。 例如,如果我輸入字母:“ abccddee”,它將輸出:

a: 1
b: 1
c: 1
c: 0
d: 0
d: 0
e: 0
e: 0

出於測試目的,我使用自己的字符串,而不是使用掃描儀。

import java.util.Scanner;

public class CountLetters
{

    public static void main(String[] args)
    {

        //create arrays
        String[] upper = new String[25];
        String[] lowerChar = new String[25];
        int [] lowerCharNum = new int[25];

        Scanner input = new Scanner(System.in);

        System.out.println("Please enter a phrase");

        //grab phrase from user
        String phrase = "abccddee";

        //create array with the size of the phrase entered from user
        String[] letters = new String[phrase.length()];
        System.out.println("letters length: " + letters.length);

        //separate every letter in phrase and store it into array "letters"
        letters = phrase.split("");

        for(int i=0; i<letters.length; i++)
        {
            lowerChar[i] = letters[i];
             switch(letters[i])
             {
               case "a":
                   lowerCharNum[0] += 1;
                   break;
               case "b":
                   lowerCharNum[1] += 1;
                   break;
               case "c":
                   lowerCharNum[2] += 1;
                   break;
               case "d":
                   lowerCharNum[3] += 1;
                   break;
               case "e":
                   lowerCharNum[4] += 1;
                   break;
               case "f":
                   lowerCharNum[5] += 1;
                   break;
            }//end of switch
            System.out.println(lowerChar[i] + ": " + lowerCharNum[i]);
        }
    }//end of main method
}//end of class

與其使用簡單的數組,不如使用Java的CollectionHashMap

使用HashMap的主要工作是處理for循環,將檢查HashMap是否已存在Character ,然后獲取與Character相關的值,並將現有值加1,如果Character不存在然后我們將一個Character放入HashMap ,並將初始計數1與關聯的角色一起存儲。

        HashMap<Character, Integer> lettersCount = new HashMap<>();
        String phrase = "abccddee";
        int length = phrase.length();
        int count = 1;
        for (int i = 0; i < length; i++) {
        int integer = 0;
        char charAt = input.charAt(i);
        if (!lettersCount.containsKey(charAt)) {
            lettersCount.put(charAt, 0);
        }
        integer = lettersCount.get(charAt);
        integer = initialCount + integer;
        lettersCount.put(charAt, integer);
    }
    System.out.println(lettersCount);

您正在使用需要在聲明時進行初始化的數組,這將創建一個額外的存儲空間,如果沒有全部遇到26個字母,並且按照您要分配的問題中提供的代碼,這將是浪費的3數組,因此將占用更多的內存,因此,此解決方案將僅需要一個HashMapHashMap將根據HashMap插入的鍵和值分配內存)和一個for循環,該循環將僅計算Charater並再次使用在程序中使用它會更容易。

您正在for循環中進行打印。 您應該在該循環之外打印頻率。

您使用的方法不可擴展。 假設該短語僅包含大寫和小寫英文字母,則您將必須在開關中編寫52個大小寫語句。

更好的方法是使用ASCII編碼來達到目的。 您可以在以下幾行中輸入一些內容:

int frequency[] = new int[128];
for (int i = 0; i < phrase.length(); i++) {
    frequency[(int) phrase.charAt(i)]++;
}

在此方法中, frequency數組用於計算phrase字符串中前128個ASCII字符的出現次數。 操作(int) phrase.charAt(i)只是將字符轉換為相應的ASCII代碼,我們將該字符的計數器增加1。在處理結束時, frequency數組將包含出現的前128個ASCII字符的數目。給定的phrase字符串。 只需打印此頻率即可獲得所需的輸出。

打印聲明必須在 for循環。

System.out.println(lowerChar[i] + ": " + lowerCharNum[i]);

更新:您需要先解析整個字符串,然后開始打印。

import java.io.*;
import java.util.*;
 class CountLetters {

    public static void main(String[] args)
    {
int i;
          //create arrays
        String[] upper = new String[25];
        String[] lowerChar = new String[25];
        int [] lowerCharNum = new int[25];


        Scanner input = new Scanner(System.in);

        System.out.println("Please enter a phrase");

        //grab phrase from user
        String phrase = "abccddee";

        //create array with the size of the phrase entered from user
        String[] letters = new String[phrase.length()];
        System.out.println("letters length: " + letters.length);

        //seperate every letter in phrase and store it into array "letters"
        letters = phrase.split("");


        for(i=0; i<letters.length; i++)
        {
            lowerChar[i] = letters[i];
        switch(letters[i])
         {
         case "a":
            lowerCharNum[0] += 1;
             break;
         case "b":
            lowerCharNum[1] += 1;
             break;
         case "c":
            lowerCharNum[2] += 1;
             break;
         case "d":
            lowerCharNum[3] += 1;
             break;
         case "e":
            lowerCharNum[4] += 1;
             break;
         case "f":
            lowerCharNum[5] += 1;
             break;
         }//end of switch



        }

for(i=0;i<5;i++)
System.out.println(lowerChar[i] + ": " + lowerCharNum[i]);



    }//end of main method


}//end of class

數組的解決方案有點復雜。 通過使用Map,我們可以將遇到的字符與遇到它們的次數直接關聯,從而非常直接地增加計數器並輸出計數器,而不必在不同的數組中查找索引。

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class CountLetters
{

    public static void main(String[] args)
    {

        Scanner input = new Scanner(System.in);

        System.out.println("Please enter a phrase");

        //grab phrase from user
        String phrase = "abccddee";

        //create array with the phrase entered from user
        char[] letters = phrase.toCharArray();
        System.out.println("letters length: " + letters.length);

        // Map to keep track of all encountered characters and the
        // number of times we've encountered them
        Map<Character, Integer> characterCounts = new HashMap<>();
        for(int i=0; i<letters.length; i++)
        {
            Character character = letters[i];
            if(characterCounts.containsKey(character))
            {
                // We've encountered this character before, increase the counter
                characterCounts.put(character, characterCounts.get(character) + 1);
            }
            else
            {
                // This is the first time we encounter this character
                characterCounts.put(lowerChar, 1);
            }
        }

        // Iterate over all character-counter pairs and print them
        for(Map.Entry<Character, Integer> entry : characterCounts.entrySet())
        {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }//end of main method
}//end of class
  • HashMap以無序的方式存儲鍵和值,並且contains only unique keys.
  • TreeMap以自然有序的方式存儲鍵和值,並且contains only unique keys.
  • LinkedHashMap按鍵插入的順序存儲鍵和值,並且contains only unique keys.

用於此要求的適當數據結構將是Map 如果要保持字母在字符串中出現的順序,可以使用LinkedHashMap,如果字母順序無關緊要,則可以使用HashMap。 我在示例中使用LinkedHashMap。

public class Test {

    public static void main(String[] args) {

        //Taking the input from the user
        System.out.println("Enter the String"); //I am entering "abccddee" for your example
        Scanner sc = new Scanner(System.in);
        String input = sc.next(); 

        //LinkedhashMap preserves the order in which input was supplied
        LinkedHashMap<Character, Integer> lhm = new LinkedHashMap<Character, Integer>();

        for(int i=0; i<input.length(); i++){

            //method get will return null if the letter is not available at the given index else it will return the count
            Integer j = lhm.get(input.charAt(i));

            //If the chracter was not present in the String
            if(j==null)
                lhm.put(input.charAt(i),1);
            //If the character was present in the String
             else
                lhm.put(input.charAt(i),j+1);

         }

         for(Character c : lhm.keySet())  
             System.out.println(c+": "+lhm.get(c)+" ");

    }

}

輸出將是:

a: 1 
b: 1 
c: 2 
d: 2 
e: 2 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM