想把前面的star和char去掉,后面跟着,为什么我的代码不行
want to delete star and the char in front and follow it, why my code does not work
Return 给定字符串的一个版本,其中对于字符串中的每个星号 (*),星号及其左右两侧的字符都消失了。所以 "ab*cd" 产生 "ad" 而 "ab**cd" 也产生 "ad"。这是一个编码问题。
public class DeleteStar {
public static void main(String[] args) {
String s=deleteS("ab*ab");
System.out.println(s);
}
public static String deleteS(String s)
{
StringBuilder sb=new StringBuilder();
for (int i=0;i<s.length();i++)
{
sb.append(s.charAt(i));
}
System.out.println(sb.toString());
for (int i=0;i<sb.length();i++)
{
if (sb.charAt(i)+""=="*")
{
sb.deleteCharAt(i);
sb.deleteCharAt(i-1);
sb.deleteCharAt(i+1);
}
}
return sb.toString();
}
}
那么你必须使用 equals 方法来比较对象
== 检查它是否是同一个实例,而不是检查它是否具有相同的值
即:
(sb.charAt(i)+""=="*")
应该是
((sb.charAt(i)+"").equals("*"))
另外你应该使用字符串的替换方法
即:
"abxxxcd".replace("xxx","");
我认为 * 可能被解释为正则表达式,因此您必须使用 \ 对其进行转义(我不确定您是否必须尝试或阅读 javadoc)
另一个可以解决这个问题的想法是:
(sb.charAt(i)=='*')
'*'被解释为一个字符
当你删除一个字符时,你也会将字符串的长度缩短 1。因此,如果你在 "ab*cd" 上调用你的序列,假设我们知道 i = 2
,我们将得到:
sb.deleteCharAt(i); // We now have "abcd"
sb.deleteCharAt(i-1); // We now have "acd"
sb.deleteCharAt(i+1); // Oops! "acd" has no index of 3!
但即使我们正确地完成了上述操作,如果我们有两颗相邻的星星,这也会产生问题。所以我们在删除之前应该检查相邻的字符是否是星号。例如,如果我们 运行 在 "ab**cd" 上执行此操作,我们将得到:
// This is the correct way if no stars are adjacent to each other.
// But if there are? Testing on "ab**cd"
sb.deleteCharAt(i-1); // We now have "a**cd"
sb.deleteCharAt(i-1); // We now have "a*cd"
sb.deleteCharAt(i-1); // We now have "acd"...wait, we need to delete c too!
另一个问题是您在迭代字符串生成器时正在修改它。这是个坏主意,因为你会得到错误的索引!考虑以下因素:
// We execute this on "ab*cd*ef", expecting "af".
for (int i = 0; i < sb.length(); i++) { // length = 8
if (sb.charAt(i) + "" == "*") {
// First execution, i = 2. Second, i = 5.
sb.deleteCharAt(i-1);
sb.deleteCharAt(i-1);
sb.deleteCharAt(i-1);
// After we executed the first time, we get that sb's length
// is now 5! Wait, so next time when we try to delete the i-1
// character, we are removing...f? That cannot be right!
}
}
由于这是一个编码练习,我将实际的调试工作留给了您自己。找出为什么事情是这样的是一个学习过程! :)
这样的解决方案怎么样?
package eu.duernau.Whosebug;
public class Sov33355763 {
public static void main(String[] a) {
String s = deleteS("aba*b");
System.out.println(s);
s = deleteS("ab*ab");
System.out.println(s);
s = deleteS("ab*cd*ef*ghij*");
System.out.println(s);
s = deleteS("0*ab*cd*ef*ghij*");
System.out.println(s);
s = deleteS("****acd****");
System.out.println(s);
}
private static String deleteS(String s) {
StringBuilder sb = new StringBuilder(s);
int lastStarPosition;
do {
lastStarPosition = sb.lastIndexOf("*");
if (lastStarPosition > 1 && lastStarPosition + 1 < sb.length()) {
sb.replace(lastStarPosition - 1, lastStarPosition + 2, "");
} else {
if (lastStarPosition + 1 == sb.length()) {
sb.replace(lastStarPosition - 1, lastStarPosition + 1, "");
} else {
if (lastStarPosition > 0) {
sb.replace(lastStarPosition - 1, lastStarPosition + 2, "");
} else {
if (lastStarPosition > -1) {
sb.replace(lastStarPosition, lastStarPosition + 2, "");
}
}
}
}
} while (lastStarPosition > -1);
return sb.toString();
}
}
生产
ab
ab
ahi
hi
d
我只看到 Regular Expressions 发生这种情况:
代码:
String pattern1 = ".?[*]+.?";
s = s.replaceAll(pattern1, "");
Return 给定字符串的一个版本,其中对于字符串中的每个星号 (*),星号及其左右两侧的字符都消失了。所以 "ab*cd" 产生 "ad" 而 "ab**cd" 也产生 "ad"。这是一个编码问题。
public class DeleteStar {
public static void main(String[] args) {
String s=deleteS("ab*ab");
System.out.println(s);
}
public static String deleteS(String s)
{
StringBuilder sb=new StringBuilder();
for (int i=0;i<s.length();i++)
{
sb.append(s.charAt(i));
}
System.out.println(sb.toString());
for (int i=0;i<sb.length();i++)
{
if (sb.charAt(i)+""=="*")
{
sb.deleteCharAt(i);
sb.deleteCharAt(i-1);
sb.deleteCharAt(i+1);
}
}
return sb.toString();
}
}
那么你必须使用 equals 方法来比较对象 == 检查它是否是同一个实例,而不是检查它是否具有相同的值 即:
(sb.charAt(i)+""=="*")
应该是
((sb.charAt(i)+"").equals("*"))
另外你应该使用字符串的替换方法 即:
"abxxxcd".replace("xxx","");
我认为 * 可能被解释为正则表达式,因此您必须使用 \ 对其进行转义(我不确定您是否必须尝试或阅读 javadoc)
另一个可以解决这个问题的想法是:
(sb.charAt(i)=='*')
'*'被解释为一个字符
当你删除一个字符时,你也会将字符串的长度缩短 1。因此,如果你在 "ab*cd" 上调用你的序列,假设我们知道 i = 2
,我们将得到:
sb.deleteCharAt(i); // We now have "abcd"
sb.deleteCharAt(i-1); // We now have "acd"
sb.deleteCharAt(i+1); // Oops! "acd" has no index of 3!
但即使我们正确地完成了上述操作,如果我们有两颗相邻的星星,这也会产生问题。所以我们在删除之前应该检查相邻的字符是否是星号。例如,如果我们 运行 在 "ab**cd" 上执行此操作,我们将得到:
// This is the correct way if no stars are adjacent to each other.
// But if there are? Testing on "ab**cd"
sb.deleteCharAt(i-1); // We now have "a**cd"
sb.deleteCharAt(i-1); // We now have "a*cd"
sb.deleteCharAt(i-1); // We now have "acd"...wait, we need to delete c too!
另一个问题是您在迭代字符串生成器时正在修改它。这是个坏主意,因为你会得到错误的索引!考虑以下因素:
// We execute this on "ab*cd*ef", expecting "af".
for (int i = 0; i < sb.length(); i++) { // length = 8
if (sb.charAt(i) + "" == "*") {
// First execution, i = 2. Second, i = 5.
sb.deleteCharAt(i-1);
sb.deleteCharAt(i-1);
sb.deleteCharAt(i-1);
// After we executed the first time, we get that sb's length
// is now 5! Wait, so next time when we try to delete the i-1
// character, we are removing...f? That cannot be right!
}
}
由于这是一个编码练习,我将实际的调试工作留给了您自己。找出为什么事情是这样的是一个学习过程! :)
这样的解决方案怎么样?
package eu.duernau.Whosebug;
public class Sov33355763 {
public static void main(String[] a) {
String s = deleteS("aba*b");
System.out.println(s);
s = deleteS("ab*ab");
System.out.println(s);
s = deleteS("ab*cd*ef*ghij*");
System.out.println(s);
s = deleteS("0*ab*cd*ef*ghij*");
System.out.println(s);
s = deleteS("****acd****");
System.out.println(s);
}
private static String deleteS(String s) {
StringBuilder sb = new StringBuilder(s);
int lastStarPosition;
do {
lastStarPosition = sb.lastIndexOf("*");
if (lastStarPosition > 1 && lastStarPosition + 1 < sb.length()) {
sb.replace(lastStarPosition - 1, lastStarPosition + 2, "");
} else {
if (lastStarPosition + 1 == sb.length()) {
sb.replace(lastStarPosition - 1, lastStarPosition + 1, "");
} else {
if (lastStarPosition > 0) {
sb.replace(lastStarPosition - 1, lastStarPosition + 2, "");
} else {
if (lastStarPosition > -1) {
sb.replace(lastStarPosition, lastStarPosition + 2, "");
}
}
}
}
} while (lastStarPosition > -1);
return sb.toString();
}
}
生产
ab
ab
ahi
hi
d
我只看到 Regular Expressions 发生这种情况:
代码:
String pattern1 = ".?[*]+.?";
s = s.replaceAll(pattern1, "");