如何解决for 循环字符串长度奇怪地跳过一些字符
正如标题中提到的,我在从文件中读取的字符串上运行 for 循环,试图删除每个 -
字符,但奇怪的是删除了一些并跳过了其他。
这是正在处理的字符串:
这是我的功能:
System.out.println(newSeq);
System.out.println(" String before deleteing - = " +newSeq + " length = " + newSeq.length());
for (int i = 0; i < newSeq.length(); i++) {
System.out.println("char at : " + i + " = " + newSeq.charAt(i) );
// Delete every -
if ( newSeq.charAt(i) == '-'){
StringBuilder lineString = new StringBuilder(newSeq);
lineString.deleteCharAt(i);
newSeq = lineString.toString();
}
}
System.out.println("String after deleting - = " + newSeq);
输出:
解决方法
如果您不需要重新发明轮子,Java 已经有一个 $ sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
curl: (60) SSL certificate problem: self signed certificate in certificate chain
More details here: https://curl.haxx.se/docs/sslcerts.html
curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it,please visit the web page mentioned above.
方法:
replace
,
您遇到了问题,因为您在循环中更改了 newSeq。
假设输入是:“1--3”。在第二次迭代中,char 将是 -。然后您将用“1-3”替换输入。下一个索引为 2 的第三次迭代将尝试检查第三个字符,但第三个字符将为 3。
你可以用替换来做到:
input.replace("-","")
或者使用正则表达式:
input.replaceAll("-+","")
或者用循环:
var input = "1--3";
StringBuilder lineString = new StringBuilder();
for (char item : input.toCharArray()) {
if (item != '-'){
lineString.append(item);
}
}
System.out.println(lineString.toString());
或使用流:
var input = "1--3";
var output = Arrays.stream(input.split(""))
.filter(character -> !character.equals("-"))
.collect(Collectors.joining());
System.out.println(output);
,
首先,值得一提的是,您正在迭代一个字符数组,然后在循环中更改这些字符。
如果不深入研究这个问题,我猜你的结果字符串中发生的事情只删除了最后一个 -
,因为对象在循环中重新分配。
为了正确执行此任务,您需要对字符串使用新变量或使用 .replace
方法,该方法会将找到的每个字符或字符串的一部分替换为另一个。
为了正确使用,仍然使用 for
循环,例如我建议您创建一个名为 result
的新字符串,然后将其与允许的字符连接:
String result = "";
for (int i = 0; i < newSeq.length(); i++) {
if ( newSeq.charAt(i) != '-'){
// this character is allowed,add it to the result
result += newSeq.charAt(i);
}
}
,
// Delete every -
if ( newSeq.charAt(i) == '-'){
StringBuilder lineString = new StringBuilder(newSeq);
lineString.deleteCharAt(i);
newSeq = lineString.toString();
}
这段代码有问题。您正在删除一个字符并再次重新分配减少的长度字符串。所以删除后右手字符的位置将向左侧移动一个位置。所以你得到了不可预测的结果。
,将其放入 StringBuilder 并从末尾开始删除。这样您的索引就不会不同步。如果你从头开始,你会错过相邻的字符。当然,这只是解决了您选择的方法的问题。使用 String.replace()
是最简单的方法。
String newSeq = "UCGU----ACAGU";
System.out.println(newSeq);
StringBuilder sb = new StringBuilder(newSeq);
for (int i = sb.length() - 1; i >= 0; i--) {
if (sb.charAt(i) == '-') {
sb.deleteCharAt(i);
}
}
newSeq = sb.toString();
System.out.println(newSeq);
印刷品
UCGUACAGU
,
您可以使用 .replaceAll()
方法,如下所示:
public static void main(String[] args) {
String newSeq = "UCGU---AGAGU";
System.out.println(newSeq);
System.out.println("String before deleting '-': " + newSeq + ",length: " + newSeq.length() + "\n");
for (int i = 0; i < newSeq.length(); i++) {
System.out.println("Char at " + i + ": " + newSeq.charAt(i));
}
newSeq = newSeq.replaceAll("-","");
System.out.println("\nString after deleting '-': " + newSeq);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。