获取 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
给定一个非空字符串和一个整数 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