2016-07-07 9 views
1

各文字の出現順を調べたいと思います。文字の出現数を順番に返します

たとえば、入力用abcddec出力はa1b1c1d1d2e1c2する必要がありますが、私の コードは、私が行う必要がありますどのような変更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ループは1つだけ必要です。遭遇した文字の出現を保存するだけです。 –

+0

こちらもご覧ください - http://stackoverflow.com/questions/275944/java-how-do-i-count-the-number-of-occurrences-of-a-char-in-a-string – sash

答えて

0

あなたのカウント技術は、文字が文字列ではなく、文字はあなたがこのような何かにforループを変更する必要があり、文字列+ 1の前に現われたびに表示されるすべての時間をカウント:

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); 

あるかどうかをチェックしますいくつかのカウンターステートホルダーを作成し、2重のFORループを避けることを好みます。また、ループでString連結を使用するのは良い習慣ではありません。StringBuilderを使用する方がよいでしょう。

+0

より良い答え。あなたがビルダーを使用してプラスのダブルを避ける:) –

0

内側ループの上限は 'i'より小さくする必要があります。

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)です

関連する問題