string怎么去掉字符串里面的所有空格

string怎么去掉字符串里面的所有空格,第1张

string怎么去掉字符串里面的所有空格
字符串,是Java中最常用的一个数据类型了。我们在日常开发时候会经常使用字符串做很多的 *** 作。比如字符串的拼接、截断、替换等。
本文我们介绍一个比较常见又容易被忽略的一个 *** 作,那就是移除字符串中的空格。
其实,在Java中从字符串中删除空格有很多不同的方法,如trim,replaceAll等。但是,在Java 11添加了一些新的功能,如strip、stripLeading、stripTrailing等。
大多数时候,我们只是使用trim方法来删除多余的空格。但是好像很多人并没有去思考过,是否有更好的方式呢?
当然,trim()在大多数情况下都工作得很好,但是Java中有许多不同的方法。每一种都有自己的优点和缺点。我们如何决定哪种方法最适合我们呢?
接下来我们将介绍几种方法,并对比下他们的区别和优缺点等。
在java中从字符串中删除空格的不同方法
首先,我们来看一下,想要从String中移除空格部分,有多少种方法,作者根据经验,总结了以下7种(JDK原生自带的方法,不包含第三方工具类库中的类似方法):
trim() : 删除字符串开头和结尾的空格。
strip() : 删除字符串开头和结尾的空格。
stripLeading() : 只删除字符串开头的空格
stripTrailing() : 只删除字符串的结尾的空格
replace() : 用新字符替换所有目标字符
replaceAll() : 将所有匹配的字符替换为新字符。此方法将正则表达式作为输入,以标识需要替换的目标子字符串
replaceFirst() : 仅将目标子字符串的第一次出现的字符替换为新的字符串
需要注意的最重要的一点是,在Java中String对象是不可变的,这意味着我们不能修改字符串,因此以上所有的方法我们得到的都是一个新的字符串。
接下啦,我们分别针对以上这几个方法学习下用法,了解下其特性。
PS:本文代码都是使用在线运行工具(>

可以参考下面的代码:

#include "stdioh"

void main()

{

char s[]="I am a teacher!";

int i,j;

for(i=0;s[i];i++)

{

if(s[i]==32&&s[i+1]==32)/如果字符串中第i和i+1个是空格,就运行if中的语句/

for(j=i;s[j];j++) {s[j]=s[j+1];i=0;}/此句是把2个空格换成一个,然后把空格之后的内容前移/

}

printf("%s\n",s);

}

扩展资料:

1、for循环小括号里第一个“;”号前为一个为不参与循环的单次表达式,其可作为某一变量的初始化赋值语句, 用来给循环控制变量赋初值; 也可用来计算其它与for循环无关但先于循环部分处理的一个表达式。

“;”号之间的条件表达式是一个关系表达式,其为循环的正式开端,当条件表达式成立时执行中间循环体。

2、if语句中的“表达式”可以是关系表达式、逻辑表达式,甚至是数值表达式。其中最直观、最容易理解的是关系表达式。所谓关系表达式就是两个数值进行比较的式子。

参考资料来源:百度百科-for循环

参考资料来源:百度百科-if语句

1 写在前面的事情的起因是这样的,我要处理一段这样的程序,用户可以以任意的形式输入11位数字+空格的形式,然后我要把他分成434的格式。然后想到的办法是: 去掉所有空格,然后按照规则划分成数组,然后再输出。那么怎么样去掉空格,常规的方法这么几个:A StringReplace()B StringSplit(new char[]{‘’},StringSplitOptionsRemoveEmptyEntries);C SystemTextRegex()来进行正则替换D 有人提出用StringBuilder,但是我们永远不要忘记StringBuilder的临界值,在小数据的情况下,使用StringBuilder反而是得不偿失的。2 性能大比拼毋容置疑,使用正则一定是最慢的办法,再次不做演示。首先贴出测试代码:static void Main(string[] args) { Stopwatch sw = new Stopwatch(); string sTemp = "11 1241 111 11 "; string sTest = StringEmpty; for (int i = 0; i < 1000; i++) { sTest += sTemp; } swStart(); for (int i = 0; i < 1000; i++) { sTestReplace(" ", ""); } swStop(); ConsoleWrite("使用Replace所消耗的时间:"); ConsoleWriteLine(swElapsedMillisecondsToString()); swReset(); swStart(); for (int i = 0; i < 1000; i++) { sTestSplit(new char[] { ' ' }, StringSplitOptionsRemoveEmptyEntries); } swStop(); ConsoleWrite("使用Split所消耗的时间:"); ConsoleWriteLine(swElapsedMillisecondsToString()); }接下来是测试结果:正如我们意料中的一样,Replace的效率一定要比Split高的,猜测的理由其实很简单,Replace的作用就是用来替换字符,而Split是用来拆分,这里属于典型的方法乱用。扩展阅读: 《NET,你忘记了么?(八)——从dynamic到特性误用》3 谈谈StringSplit()我没有办法看到StringReplace()源码,那么在这里就只说说StringSplit()。大致代码可以通过Reflector看到,这里只粘贴出核心的代码:public string[] Split(string[] separator, int count, StringSplitOptions options) { bool flag = options == StringSplitOptionsRemoveEmptyEntries; int[] sepList = new int[thisLength]; int[] lengthList = new int[thisLength]; int numReplaces = thisMakeSeparatorList(separator, ref sepList, ref lengthList); if ((numReplaces == 0) || (count == 1)) { return new string[] { this }; } if (flag) { return thisInternalSplitOmitEmptyEntries(sepList, lengthList, numReplaces, count); } return thisInternalSplitKeepEmptyEntries(sepList, lengthList, numReplaces, count); } 首先我们来关注下MakeSeparatorList方法,在这个方法里,微软通过遍历分隔符数组和字符串,两层for循环,得到了字符串中,每个分隔符所在的索引。接下来就是根据索引来直接分割字符串了,无需赘言。4 算法分析从上面的代码,我们可以很轻松地看出,算法的时间复杂度是O(MN),那么我们有没有更优的算法来实现他呢?首先,我们要看到算法的时间复杂度瓶颈在于MakeSeparatorList方法,那就来优化这个方法,实现如下:private static bool[] MakeSeparatorList(char[] separatorArray) { bool[] charArray = new bool[255]; for (int i = 0; i < separatorArrayLength; i++) { charArray[separatorArray[i]] = true; } return charArray; } 那么之后我们就可以在遍历字符串的时候,直接通过每个字符的ASC2码来得到这个字符是否是分隔符了。5 算法优劣既然这样的算法时间复杂度小,那为什么微软不采用这样的算法呢?时间复杂度并不能决定算法的优劣,我们所谓的指数型,对数型还是ON级,都是针对当数据量大幅度增长时。但是在此问题中,分隔符只有1个,我们却需要为这一个字符去声明一个大小为255的bool型数组,这在空间复杂度上是很得不偿失的。那么该算法适合什么?该算法适合当分隔符具有多个,字符串也很长时,那么O(N)就远远小于O(MN)了。6 写在最后好久没有写东西了,以至于写写自己已经不知道自己在写什么了。东西写得乱七八糟,算了算了……只是警醒自己,也警醒各位,NET Framework为我们提供了大量的类库方法支持,但是在用一个方法之前,我们是否该把这个方法搞清楚,这个方法是否是最优的方法,我们是该自己重新写一个方法,还是……追本溯源,这才是程序员该做的。

//下面是删除字符串中空格的函数
//   调用:
//       char str[] = "dfa af afdaf adfaf" ;
//       delspace(str);//执行后,str变成:  "dfaafafdafadfaf" ;
//函数名:delspace
//参数:
//     char s: 要处理的字符串
//返回值:无
void delspace( char  s)
{
    char  p = s;     //定义一个字符指针,指向字符串开头
    //程序准备用s 当游标,从字符串的开头,移动到字符串的结尾
    while( s !='\0') //当不是字符串的结尾
    {
        if( s !=' ' )    //当s指向的字符不是空格时;
            p++ = s++;  //把s指向的内容给p,两个指针同时后移
        else              //当s是空格时
            s++;          //只移s指针,也就是跳过了空格。
    }
    p='\0'; //最后p指向的位置设定结束符
}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13352091.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-20
下一篇 2023-07-20

发表评论

登录后才能评论

评论列表(0条)

保存