2016-07-07 26 views
1

我希望按升序查找每個字符的發生次數。按順序計算字符的發生次數

例如,輸入輸出abcddeca1b1c1d1d2e1c2,但我 代碼是給我輸出a1b1c2d2e1c2

我應該做什麼樣的變化?

package com.Java8; 

public class Occurences { 

    public static void main(String[] args) { 

     String str = "abb"; 
     char[] arr = str.toCharArray(); 
     String result = ""; 
     for (int i = 0; i < arr.length; i++) { 
      int count = 0; 
      for (int j = 0; j < arr.length; j++) { 
       if (arr[i] == arr[j]) { 
        count++; 
       } 
      } 
      result = result + arr[i] + count; 
     } 
     System.out.println(result); 
    } 
} 
+0

你不需要遍歷字符串,你實際上只需要一個'for'循環。你只需要存儲你遇到的字符的出現。 –

+0

看看這裏以及 - http://stackoverflow.com/questions/275944/java-how-do-i-count-the-number-of-occurrences-of-a-char-in-a-string – sash

回答

0

你的計數技術統計每個字符出現在字符串中的時間,而不是每次字符之前出現的字符串+ 1在您需要的for循環改變這樣的事情:

for (int i = 0; i < arr.length; i ++){ 
    int count = 1; 
    for (int j = 0; j < i; j ++){ 
     if(arr[i] == arr[j]){ 
      count ++;   
     } 
    } 
    result = result + arr[i] + count; 
} 

這將通過每個字符迭代在for循環的字符之前,檢查它們是否相等

+0

謝謝,它的作品! – Laya

1
String str = "abcddecca"; 
char[] arr = str.toCharArray(); 
StringBuilder sb = new StringBuilder(); 
Map<Character, Integer> counters = new HashMap<>(); 
for(int i = 0; i < arr.length; i++) { 
    Integer count = counters.get(arr[i]); 
    if (count == null) { 
    count = 1; 
    } else { 
    count++; 
    } 
    counters.put(arr[i], count); 
    sb.append(arr[i]); 
    sb.append(count); 
} 
System.out.println(sb); 

我會寧願創建一些計數器狀態持有者並避免雙重FOR循環。在循環中使用String連接也不是一個好習慣,最好使用StringBuilder。

+0

更好的答案。避免雙重加你使用建設者:) –

0

你的內循環上限應該小於'我'。

public class Occurences { 
    public static void main(String[] args) { 
     String str = "abb"; 
     char[] arr = str.toCharArray(); 
     String result = ""; 
     for (int i = 0; i < arr.length; i++) { 
      int count = 1; 
      for (int j = 0; j < i; j++) { //j upper limit should be i 
       if (arr[i] == arr[j]) { 
        count++; 
       } 
      } 
      result = result + arr[i] + count; 
     } 
     System.out.println(result); 
    } 
} 
1

避免雙倍。存儲在地圖什麼的狀態:

String str="abbcece"; 
    char []charArray=str.toCharArray(); 
    StringBuilder result = new StringBuilder(); 
    Map<Character, Integer> occurenceMap = new HashMap<Character, Integer>(); 
    for(Character character:charArray){ 
     Integer occ = 1; 
     if(occurenceMap.containsKey(character)){ 
      occ = occurenceMap.get(character)+1; 
     } 
     occurenceMap.put(character, occ); 
     result.append(character).append(occ); 
    } 

    System.out.println(result.toString()); 
+0

只是我想的方式 –

0

您可以使用地圖計算每個字母的發生:

public static void main(String[] args){ 
    String s = "abcddec"; 
    Map<Character, Integer> mapCount = new HashMap<>(); 
    StringBuilder sb = new StringBuilder(); 

    for (char c : s.toCharArray()){ 
     if(mapCount.containsKey(c)){ 
      mapCount.put(c, mapCount.get(c) +1); 
     } 
     else mapCount.put(c, 1); 
     sb.append(String.valueOf(c) + mapCount.get(c)); 
    } 
    System.out.println(sb.toString()); 
} 

時間解決方案的複雜性是O(N)