9

右から始めて、Java文字列の8文字ごとに(ダッシュ/マイナス文字)を挿入する最良の方法は何ですか?-

例:

1111 -> 1111
111111111 -> 1-11111111
1111111111111111 -> 11111111-11111111
100001111111111111111 -> 10000-11111111-11111111

私が自分でやろうとしたことを示すための私の試み(以下のコメントは「これは宿題ですか?」と尋ねます:

import junit.framework.TestCase;
public class InsertCharacterAfterEveryNCharacters extends TestCase {
  public static String insertSpacerAfterNCharactersFromTheRight(char spacer,
      int spacing, String string) {
    final int length = string.length();
    final int newStringCapacity = length + (int) Math.ceil(length / (double) spacing);
    StringBuilder stringBuilder = new StringBuilder(newStringCapacity);
    for (int i = length - 1; i >= 0; i--) {
      stringBuilder.append(string.charAt(i));
      if (i % spacing == 0 && i > 0) {
        stringBuilder.append(spacer);
      }
    }
    return stringBuilder.toString();
  }
  public static void testInsertSpacerAfterNCharactersFromTheRight() {
    assertEquals("", insertSpacerAfterNCharactersFromTheRight('-', 8, ""));
    assertEquals("1", insertSpacerAfterNCharactersFromTheRight('-', 8, "1"));
    assertEquals("11", insertSpacerAfterNCharactersFromTheRight('-', 8, "11"));
    assertEquals("11111111",
        insertSpacerAfterNCharactersFromTheRight('-', 8, "11111111"));
    assertEquals("1-11111111",
        insertSpacerAfterNCharactersFromTheRight('-', 8, "111111111"));
    assertEquals("11111111-11111111",
        insertSpacerAfterNCharactersFromTheRight('-', 8, "1111111111111111"));
  }
}
4

5 に答える 5

34

すべての答えは、何をする必要があるかについて少し多くのコードのようです。これを行うには、正規表現を使用できます。

フォーマットされた文字列を返すメソッドがあるとしましょう。

単純で明確な例:

String myString = "00000000000111111111111100000000001111111000011000000";
String newString = myString.replaceAll("(.{8})(?!$)", "$1-");
return newString;

上記は、次の短い表記と同じです。

return myString.replaceAll("(.{8})(?!$)", "$1-");

別の同様の短い表記(固定されたハードコードされた文字列の場合):

return "00000000000111111111111100000000001111111000011000000".replaceAll("(.{8})(?!$)", "$1-");

コードの各部分は、次の文字列を返します。

00000000-00011111-11111111-00000000-00111111-10000110-00000

正規表現の詳細については、たとえばhttp://www.regular-expressions.info/java.htmlを参照してください。

これが将来誰かに役立つことを願っています。

編集注:最後のグループには8文字はありません。ただし、そうする場合は、ダッシュを追加しません。

于 2013-09-26T12:11:59.463 に答える
17

char[]オリジナルから構築するString

String str = "100001111111111111111";

// add enough space for an additional "-" for every 8 chars:
char[] chars = new char[str.length() + (str.length() / 8)];

// this offset will give us the first "-" position from the LEFT:
int offset = str.length() % 8;
int idx = 0, strIdx = 0;

for (; strIdx < str.length(); idx++, strIdx++)
{
    if (((strIdx % 8) == offset) && (strIdx != 0))
        chars[idx++] = '-';
    chars[idx] = str.charAt(strIdx);
}

String str2 = new String(chars);

System.out.println(str2);

または、を使用することもできます。これには、配列のコピー操作StringBuilderが含まれる可能性があります。(length / 8)

StringBuilder str = new StringBuilder("100001111111111111111");
int idx = str.length() - 8;

while (idx > 0)
{
    str.insert(idx, "-");
    idx = idx - 8;
}

System.out.println(str.toString());

いずれの場合も出力:

10000-11111111-11111111

これはインデックスにハイフンを挿入しないことに注意して0ください。必要に応じてコードを調整する必要があります。

于 2012-08-15T17:44:25.843 に答える
1

上記の解決策は良いですが、非常に複雑で長いので、私はこれを書きました、そしてそれはあなたの入力のために働きます。

public static String insertCharacterForEveryNDistanceFromRight(int distance, String original, char c){
    StringBuilder sb = new StringBuilder();
    char[] charArrayOfOriginal = original.toCharArray();
    for(int ch = charArrayOfOriginal.length ; ch > 0 ; ch--){
        if(ch % distance == 0 && ch != charArrayOfOriginal.length)
            sb.append(c).append(charArrayOfOriginal[charArrayOfOriginal.length - ch]);
        else
            sb.append(charArrayOfOriginal[charArrayOfOriginal.length - ch]);
    }
    return sb.toString();
}

そして、このように呼んでください...

String rightResult = InsertSpaces.insertCharacterForEveryNDistanceFromRight(8, "100001111111111111111", '-');
System.out.println(rightResult);
于 2014-05-27T13:25:51.427 に答える
0

-文字列は不変であるため、既存のJava文字列に文字通りを挿入することはできません。ただし、出力形式の要件を満たす新しいStringインスタンスを作成できます。

入力文字列の終了インデックスから0までループします。反復ごとに:

  • 現在のインデックスの値をStringBuilderインスタンスの先頭に挿入します。
  • モジュロ演算子を使用して、8文字の倍数を挿入したかどうかを確認します。その場合は、ダッシュを挿入します。

必要に応じて、StringBuilderインスタンスの「toString()」メソッドを使用して文字列を取得します。

于 2012-08-15T17:42:27.297 に答える
0

おそらくこのようなものですか?

for(int i = s.length() - 1; i > 0; i -= 8)
{
    s = new StringBuffer(s).insert(i, "-").toString();
    i--;
}
于 2012-08-15T17:43:48.773 に答える