0

私の目標は、文字列を圧縮するプログラムを作成することです。たとえば、次のようになります。

入力: helloooppppp!
出力:he2l3o6p!

これまでのコードは次のとおりですが、エラーがあります。

入力がある場合: hellooo

私のコード出力: hel2l3o

代わりに: he213o

2 が間違った場所に印刷されていますが、これを修正する方法がわかりません。

また、次の入力を使用: hello

私のコード出力: hel2l

代わりに: he2lo

この場合、最後の文字をすべて一緒にスキップし、2 も間違った場所にあり、最初の例のエラーです。

どんな助けでも大歓迎です。本当にありがとう!

 public class compressionTime
{
public static void main(String [] args)
{
       System.out.println ("Enter a string");

       //read in user input
       String userString = IO.readString();

       //store length of string
       int length = userString.length();

       System.out.println(length);

       int count;
       String result = "";

        for (int i=1; i<=length; i++)
        {
            char a = userString.charAt(i-1);
            count = 1;

            if (i-2 >= 0) 
            {
                while (i<=length && userString.charAt(i-1) == userString.charAt(i-2)) 
                {
                    count++;

                    i++;
                } 
               System.out.print(count);                 
            }

            if (count==1) 

                result = result.concat(Character.toString(a));
            else 

                result = result.concat(Integer.toString(count).concat(Character.toString(a)));

        }



   IO.outputStringAnswer(result);
}

}

4

7 に答える 7

1

私は...するだろう

  • Java でインデックスが機能する方法であるため、0 から数えます。あなたのコードはより簡単になります。
  • 現在の文字を次の文字と比較します。これにより、最初の文字の出力が回避されます。
  • 小さくないので圧縮llされません。2l少なくとも 3 つのシーケンスのみが役立ちます。
  • 3番号toが使用されているかどうかを検出9し、少なくともエラーを出力してみてください。
  • デバッガーを使用してコードをステップ実行し、コードが何をしているのか、また、本来あるべきことを実行しない理由を理解してください。
于 2013-10-29T18:36:53.727 に答える
0

これがどのように機能するかを理解していない場合は、正規表現を学ぶ必要があります。

public String rleEncodeString(String in) {
    StringBuilder out = new StringBuilder();
    Pattern p = Pattern.compile("((\\w)\\2*)");
    Matcher m = p.matcher(in);

    while(m.find()) {
        if(m.group(1).length() > 1) {
            out.append(m.group(1).length());
        }
        out.append(m.group(2));
    }

    return out.toString();
}
于 2013-10-29T18:57:33.903 に答える
0

次のようなことを試してください:

public static void main(String[] args) {
    System.out.println("Enter a string:");
    Scanner IO = new Scanner(System.in);
    // read in user input
    String userString = IO.nextLine() + "-";

    int length = userString.length();

    int count = 0;
    String result = "";
    char new_char;

    for (int i = 0; i < length; i++) {
        new_char = userString.charAt(i);
        count++;
        if (new_char != userString.charAt(i + 1)) {
            if (count != 1) {
                result = result.concat(Integer.toString(count + 1));
            }
            result = result.concat(Character.toString(new_char));
            count = 0;
        }
        if (userString.charAt(i + 1) == '-')
            break;
    }

    System.out.println(result);
}
于 2013-10-29T18:57:41.567 に答える
0

問題は、次の文字ではなく前の文字が現在の文字と同じかどうかをコードがチェックすることです。

ループforは基本的に文字列内の各文字を通過し、前の文字と同じ場合、その文字がいくつあるかを計算し、その数字を結果の文字列に入れます。ただし、"hello" のような単語の場合、"e" と "l" をチェックし (そして、それらの前に "h" と "e" があることを受容的に確認します)、繰り返しがないと見なします。次に、次の「l」に到達し、前の文字と同じであることを確認します。結果に「2」が入りますが、遅すぎて「he2lo」ではなく「hel2l」になります。

forコードをクリーンアップして修正するには、ループを次のように置き換えることをお勧めします。

   int count = 1;
   String result = "";
   for(int i=0;i<length;i++) {
       if(i < userString.length()-1 && userString.charAt(i) == userString.charAt(i+1))
           count++;
       else {
           if(count == 1)
               result += userString.charAt(i);
           else {
               result = result + count + userString.charAt(i);
               count = 1;
           }
       }
   }

いくつかの変更について説明する必要がある場合は、コメントしてください。必須のものもあれば、オプションのものもあります。

于 2013-10-29T18:43:17.440 に答える