1

我必须从给定的字符串中删除前导和尾随空格以及组合连续的空格。例如,

String str = "    this is    a   string  containing numerous  whitespaces   ";

我需要将其返回为:

"this is a string containing numerous whitespaces";

但问题是我不能使用String#trim(). (这是一个家庭作业,我不允许使用这种方法。)我目前正在尝试通过一个一个地访问每个字符但非常不成功。

我需要一个优化的代码。有人可以帮忙吗?我需要在今天之前完成 :(

4

8 回答 8

5

编辑:在我们被告知无法使用之前发布的答案replaceAll。我把它留在这里是因为它可能对其他读者有用,即使它对 OP 没有用。

我需要一个优化的代码。

真的需要优化它吗?你确定这是一个瓶颈吗?

这应该这样做:

str = str.replaceAll("\\s+", " ");

这是一个正则表达式,表示“用单个空格替换任何连续的空格”。它可能不是最快的,但我会在尝试其他任何东西之前对其进行基准测试。

请注意,这会将所有空格替换为空格 - 因此,如果您有制表符或其他空格字符,它们也将替换为空格。

于 2013-04-06T09:32:05.047 回答
3

我不允许使用这些方法。我必须用循环和所有来做到这一点。

因此,如果您不能使用更快、更有效的方式,我为您写了一些代码片段:

String str = "    this is    a   string  containing numerous  whitespaces   ";
StringBuffer buff = new StringBuffer();
String correctedString = "";
boolean space = false;
for (int i = 0; i < str.length(); i++) {
    char c = str.charAt(i);
    if (c == ' ') {
        if (!space && i > 0) {
            buff.append(c);
        }
        space = true;
    }
    else {
        buff.append(c);
        space = false;
    }
}
String temp = buff.toString();
if (temp.charAt(temp.length() - 1) == ' ') {
    correctedString = temp.substring(0, buff.toString().length() - 1);
    System.out.println(correctedString);
}
System.out.println(buff.toString())

笔记:

但这是“硬编码”的,仅用于“学习”。

更有效的方法是肯定使用@JonSkeet 和@BrunoReis 指出的方法

于 2013-04-06T09:37:21.667 回答
2

怎么样str = str.replaceAll(" +", " ").trim();

如果您不想使用trim()(而且我真的没有理由不使用),请将其替换为:

str = str.replaceAll(" +", " ").replaceAll("^ ", "").replaceAll(" $", "");`
于 2013-04-06T09:30:54.643 回答
0

在不使用任何内置库函数的情况下删除空格这只是一个具有固定数组大小的简单示例。

public class RemWhite{ 
public static void main(String args[]){ 
String s1=" world qwer ";
int count=0;
char q[]=new char[9];
char ch[]=s1.toCharArray();
System.out.println(ch); 

    for(int i=0;i<=ch.length-1;i++)
   {
     int j=ch[i];
     if(j==32)
     {
      continue;
     }
   else
      q[count]=ch[i];
      count++;

      } 
   System.out.println(q); 

  }} 
于 2016-05-23T19:16:39.330 回答
0

去除单次或再次出现的空间。

public class RemoveSpace {
    public static void main(String[] args) {

        char space = ' ';
        int ascii = (int) space;

        String str = "    this is    a   string  containing numerous  whitespaces   ";
        char c[] = str.toCharArray();

        for (int i = 0; i < c.length - 1; i++) {
            if (c[i] == ascii) {
                continue;
            } else {
                System.out.print(c[i]);
            }
        }

    }

}
于 2017-08-22T17:23:23.817 回答
0

如果您不想使用任何内置方法,这就是您所指的

private static String trim(String s)
{
    String s1="";boolean nonspace=false;
    for(int i=0;i<s.length();i++)
    {
        if(s.charAt(i)!=' ' || nonspace)
        {
            s1 = s1+s.charAt(i);
            nonspace = true;
        }
    }
    nonspace = false;
    s="";
    for(int i=s1.length()-1;i>=0;i--)
    {
        if(s1.charAt(i)!=' ' || nonspace)
        {
            s = s1.charAt(i)+s;
            nonspace = true;
        }
    }
    return s;
}
于 2018-01-20T14:20:46.613 回答
0
package removespace;

import java.util.Scanner;

public class RemoveSpace {

    public static void main(String[] args) {

        Scanner scan= new Scanner(System.in);

        System.out.println("Enter the string");

        String str= scan.nextLine();

        String str2=" ";

        char []arr=str.toCharArray();

        int i=0;

        while(i<=arr.length-1)
        {
            if(arr[i]==' ')
            {
                i++;
            }
            else
            {
                str2= str2+arr[i];
                i++;
            }

        }
        System.out.println(str2);

    }
}
于 2018-12-24T04:16:17.470 回答
-1

此代码用于删除给定字符串中的空格和重新出现的字母,而不使用 trim()。我们接受来自用户的字符串。我们使用 charAt() 将其分隔为字符,然后将每个字符与 null(' ') 进行比较。如果找到 null 我们跳过它并在 else 部分显示该字符。为了跳过空值,我们将索引 i 增加 1。尝试使用此代码来解决您的问题。

String name = " abc "; 
System.out.println(name);
for (int i = 0; i < name.length(); i++) {
    char ch = name.charAt(i);
    if (ch == ' ') {
        i = 2 + i - 2;
    } else {
        System.out.print(name.charAt(i));
    }
}
于 2015-11-05T19:39:32.757 回答