java - 如何按顺序统计字符串中的字符?

标签 java string javafx char stringbuilder

我有一个用于 2D 平台游戏中编辑器的 String,用户可以单击 16x60 矩形板来创建自定义板。我循环遍历这些矩形并得到一个我想要修剪的字符串。 x 是 block ,a 是空白区域。我需要这个来绘制关卡。

String s = "x1x1x1x1a1a1x1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1";

我想将其修剪为x4a2x1a54。基本上是将紧随其后出现的 x 和 a 相加。

我该怎么做?

最佳答案

循环字符并存储最后一个字母字符。对于每个字符,解析其后面的数字。如果字母字符与最后一个字符相同,您可以将此数字添加到计数中,否则将旧结果写入输出:

public static String compress(String input) {
    if (input == null || input.isEmpty()) {
        return input;
    }
    char type = ' ';
    int count = 0;
    StringBuilder output = new StringBuilder();
    int index = 0;
    final int length = input.length();
    while (index < length) {
        char elementType = input.charAt(index);

        // parse number
        int elementCount = 0;
        char c;
        for (index++; index < length && Character.isDigit(c = input.charAt(index)); index++) {
            elementCount = 10 * elementCount + (c - '0');
        }

        if (elementType == type) {
            count += elementCount;
        } else {
            // finish counting last type
            output.append(type).append(count);
            type = elementType;
            count = elementCount;
        }
    }
    output.delete(0, 2); // remove substring added for the initial count/type
    output.append(type).append(count); // append last entry
    return output.toString();
}

这允许您输出与 1 不同的数字,例如

compress("a22a20x9")

关于java - 如何按顺序统计字符串中的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50200512/

相关文章:

Java代码没有显示错误,但JFrame不会显示

c++ - 如何按多种括号类型拆分字符串但仍将括号保留在 C++ 中?

Mysql提取json数据并搜索多个值

C++:set 如何知道两个项目何时相等?

java - 目标相当于 base16().decode(String)

java - JBOSS 7 域 jsp 更改重新启动后未反射(reflect)

java - GData API 中的电子表格身份验证

JavaFX 导航栏和内容 Pane

javafx - 使用多个值过滤 JFX TableView

javascript - 执行 javascript 并返回响应 (JavaFX/Swing)