簡體   English   中英

一種更簡單有效的方法?

[英]A easier and efficient way to do this?

好的,id認為自己了解基礎知識和一些高級Java,但仍然沒有勇氣開始編寫我的想法。 這是我想到的一個簡單程序,它基本上輸出您的文本具有的特定字母的數量(我認為我的措辭錯了...),這是我的代碼:

public class gene {

public static void main(String[] args) {

    String[] phrases = {"hello", "egg", "learning", "ferrero", "rocher",
            "Horologe", "Twinling"};
    int a=0;
    int b=0;
    int c=0;
    int d=0;
    int e=0;
    int f=0;
    int g=0;
    int h=0;
    int i=0;
    int j=0;
    int k=0;
    int l=0;
    int m=0;
    int n=0;
    int o=0;
    int p=0;
    int q=0;
    int r=0;
    int s=0;
    int t=0;
    int u=0;
    int v=0;
    int w=0;
    int x=0;
    int y=0;
    int z=0;

    for(int ii =0; ii <phrases.length; ii++){
    char[] charphrases = phrases[ii].toCharArray();
    for(int iii = 0; iii<charphrases.length; iii++){
        switch(charphrases[iii]){
        case ('a'):
            a++;
        break;          
    case ('b'):
        b++;
    break;
    case ('c'):
        c++;
    break;
    case ('d'):
        d++;
    break;
    case ('e'):
        e++;
    break;
    case ('f'):
        f++;
    break;
    case ('g'):
        g++;
    break;
    case ('h'):
        h++;
    break;
    case ('i'):
        i++;
    break;
    case ('j'):
        j++;
    break;
    case ('k'):
        k++;
    break;
    case ('l'):
        l++;
    break;
    case ('m'):
        m++;
    break;
    case ('n'):
        n++;
    break;
    case ('o'):
        o++;
    break;
    case ('p'):
        p++;
    break;
    case ('q'):
        q++;
    break;
    case ('r'):
        r++;
    break;
    case ('s'):
        s++;
    break;
    case ('t'):
        t++;
    break;
    case ('u'):
        u++;
    break;
    case ('v'):
        v++;
    break;
    case ('w'):
        w++;
    break;
    case ('x'):
        x++;
    break;
    case ('y'):
        y++;
    break;
    case ('z'):
        z++;
    break;
        }
    }
    }

    System.out.println("A:" + a + "\n" + "B:" + b + "\n" +"C:" + c + "\n" +"D:" + d + "\n" +"E:" + e + "\n" +"F:" + f + "\n" +"G:" + g + "\n" +"H:" + h + "\n" +"I:" + i+ "\n" +"J:" + j + "\n" +"K:" + k + "\n" +"L:" + l + "\n" +"M:" + m + "\n" +"N:" + n + "\n" +"O:" + o + "\n" +"P:" + p + "\n" +"Q:" + q + "\n" +"R:" + r+ "\n" +"S:" + s + "\n" +"T:" + t + "\n" +"U:" + u + "\n" +"V:" + v + "\n" +"W:" + w + "\n" +"X:" + x + "\n" +"Y:" + y + "\n" +"Z:" + z + "\n" + z);
    }

}

如您所見,對於這樣一個簡單的程序,它的使用時間非常長,並且毫無疑問,它的編寫方法更短。 有人可以告訴我在哪里可以壓縮該程序以使其更短,更有效。

怎么樣

int[] count = new int[26];

你可以做

for(char c: string.toCharArray())
    count[c - 'a']++;

無需聲明26個不同的int變量,而是聲明一個長度為26的int數組。此處的所有元素都會自動初始化為0。

int[] letterCounts = new int[26];

然后,利用字母數字值全部按數字順序的事實,而不是26種情況。 如果從字母中減去'a' ,您將得到一個介於0到25之間的值,該值代表您所需的索引。 然后您可以說:

letterCounts[charphrases[iii] - 'a']++;

根據您的要求,您可能需要單獨處理其他字符,例如大寫字母,數字和/或標點符號。

然后,您可以遍歷數組內容,添加'a'以重現字母,然后打印適當的數組元素。

您可以擁有26個成員的數組,而不是26個變量。 我們知道0-25之間的每個索引代表什么(0是'A',1是'B',2是'C',依此類推...然后遞增該字母,可以通過轉換char來找到其索引轉換為整數(轉換將要求您手頭有一個ASCII引用,任何都可以。)只要您了解必要的偏移量,學習在char和ints之間進行轉換就相對簡單。

您可能要考慮使用Map Map允許您將一個數據與另一個數據相關聯,因此,如果您可以執行以下操作:

Map<Character, Integer> characterCount = new LinkedHashMap<>();

Integer currentCount = characterCount.get('a');
if(currentCount == null) {
    currentCount = 0;
}
characterCount.put('a', currentCount++);

它比其他人建議的使用數組要復雜一些,但是如果您以后不想再在某個地方使用char ,它會更加靈活。

我使用Map為您編寫了一個程序。 看看這個:

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

public class Main {
    public static void main(String[] args) {
         Map<Character, Integer> map = new HashMap<Character, Integer>();
        System.out.println(map);
        String alphabet = "abcdefghijklmnopqrstuvwxyz";
        for(char c : alphabet.toCharArray())
            map.put(c, 0);
         addString("Hello World", map);
         System.out.println(map);
  }

    public static void addString(String s, Map<Character, Integer> m){
        s = s.toLowerCase().replace(" ", "");
        for(char c : s.toCharArray())
            m.put(c, m.get(c) + 1);
    }
}

我已經改善了mjkaufers的答案,這是您可以計算任何字符(包括UTF-8和特殊字符)的方法:

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

public class Main {
    public static void main(String[] args) {
        Map<Character, Integer> map = new HashMap<Character, Integer>();
        countCharacters("Hello World", map);
        System.out.println(map);
    }

    public static void countCharacters(String s, Map<Character, Integer> m) {
        s = s.replace(" ", ""); // do not count spaces

        // if you only want to count lower case characters:
        // s = s.toLowerCase();

        for (char c : s.toCharArray()) {
            int cnt = (m.get(c) == null) ? 0 : m.get(c);
            m.put(c, cnt + 1);
        }
    }
}

暫無
暫無

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

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