获取 ASCII 值而不是字符串值

Getting ASCII value instead of string value

给定一个非空字符串和一个整数 N,return 字符串以 char 0 开头,然后是字符串的每个第 N 个字符。因此,如果 N 为 3,使用 char 0, 3, 6, ... 等等。 N 为 1 或更大。

 everyNth("Miracle", 2) → "Mrce"
 everyNth("abcdefg", 2) → "aceg"
 everyNth("abcdefg", 3) → "adg"

这段代码实际上并未编译。但是在调试模式下放置了几个断点和 运行 之后,它显示它将 return 一个 ASCII 值“77”而不是 str.charAt() 位置的字符串值。我不确定为什么。请帮忙。

我正在努力学习和理解解决这个问题的基本逻辑。

我知道您可以使用 Stringbuilder 并将每个值附加到缓冲区而不是打印值是获得答案的一种方式。所以我想避免使用任何预定义的 类,这将在后台执行逻辑。

尝试: 我也尝试将 String 类型转换为 char,但结果相同。

public static String everyNth(String str, int n){
    String charAtPosition = "";
    int x = 0, pos = 0;
    String finalString = "";
    String stringPosition = str.charAt(pos); <-- Getting ASCII value instead of string value for ex. in "Miracle" string input, it should return "M"
    charAtPosition = stringPosition * n;
    for(int i = 0; i < str.length(); i++){
        finalString = finalString + charAtPosition;
    }
    return finalString;
}

您的代码无法编译。首先,将 String stringPosition = str.charAt(pos) 替换为 String stringPosition = String.valueOf(str.charAt(0)) 作为 str.charAt(pos) returns 无法分配给 String 变量的 char 值。

此外,它就像用 0 启动循环计数器并以值 n 步进一样简单。在每次迭代中,将循环计数器中的字符附加到 StringBuilder.

public final class Main {

    public static final void main(String[] args) {
        System.out.println(everyNth("Miracle", 2));
        System.out.println(everyNth("abcdefg", 2));
        System.out.println(everyNth("abcdefg", 3));
    }

    public static String everyNth(String str, int n) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str.length(); i += n) {
            sb.append(str.charAt(i));
        }
        return sb.toString();
    }
}

输出:

Mrce
aceg
adg

您可以使用 String 而不是 StringBuilder 但我建议您在这种情况下使用 StringBuilder 而不是 String 因为循环中重复的字符串连接会产生额外的String 的实例数与串联数一样多。检查 this discussion 以了解更多信息。

这是一种使用 lambda 和流的方法。

  • 从 0 开始迭代每第 n 个整数
  • 映射第 n 个字符
  • 转换为字符串
BiFunction<String, Integer, String> everyNth =
        (s, n) -> IntStream
                .iterate(0, i -> i < s.length(), i -> i + n)
                .mapToObj(i -> s.charAt(i) + "")
                .reduce("", (a, b) -> a + b).toString();

一些测试数据和一个运行

Map<String, Integer> testData =
        Map.of("Miracle", 2, "abcdefgh", 2, "abcdefg", 3, "a",
                4, "programming", 4, "notchanging", 1);

testData.forEach((k, v) -> System.out.printf("Every %s, %-12s -> %s%n",
        v, k, everyNth.apply(k, v)));

打印

Every 2, Miracle      -> Mrce
Every 4, programming  -> pri
Every 2, abcdefgh     -> aceg
Every 4, a            -> a
Every 1, notchanging  -> notchanging
Every 3, abcdefg      -> adg