2011-10-28 88 views
1

我正在尝试为我的AP Java类创建一个回文测试程序,并且我需要完全删除代码中的空白区域,但它不会让我这样做。我如何删除空白?

import java.util.Scanner; 

public class Palin{ 

    public static boolean isPalindrome(String stringToTest) { 
    String workingCopy = removeJunk(stringToTest); 
    String reversedCopy = reverse(workingCopy); 

    return reversedCopy.equalsIgnoreCase(workingCopy); 
    } 

    public static String removeJunk(String string) { 
    int i, len = string.length(); 
    StringBuffer dest = new StringBuffer(len); 
    char c; 


    for (i = (len - 1); i >= 0; i-=1) { 
     c = string.charAt(i); 
     if (Character.isLetterOrDigit(c)) 
     { 
     dest.append(c); 
     } 


    } 

    return dest.toString(); 
    } 

    public static String reverse(String string) { 
    StringBuffer sb = new StringBuffer(string); 

    return sb.reverse().toString(); 
    } 

    public static void main(String[] args) { 
    System.out.print("Enter Palindrome: "); 
    Scanner sc = new Scanner(System.in); 
    String string = sc.next(); 

    String str = string; 
    String space = ""; 
    String result = str.replaceAll("\\W", space); 
    System.out.println(result); 

    System.out.println(); 
    System.out.println("Testing palindrome:"); 
    System.out.println(" " + string); 
    System.out.println(); 

    if (isPalindrome(result)) { 
     System.out.println("It's a palindrome!"); 
    } else { 
     System.out.println("Not a palindrome!"); 
    } 
    System.out.println(); 
    } 
} 

任何帮助将不胜感激。

回答

1

似乎你的代码是好的除了以下。您正在使用

String string = sc.next(); 

这将不会读取整行输入,因此您将丢失部分文本。我认为你应该使用以下代替那条线。

String string = sc.nextLine(); 
0

使用的StringTokenizer删除" "

StringTokenizer st = new StringTokenizer(string," ",false); 
    String t=""; 
    while (st.hasMoreElements()) t += st.nextElement(); 
    String result = t; 
    System.out.println(result); 
+0

我会把它放在哪里? – Kentaro51

+0

这应该替换你的'replaceAll'块 –

+0

但是,还应该使用'replaceAll(“\\ W”,“”)'和replaceAll(“\\ s +”,“”)' –

0

另一件事看出来的是,虽然移除所有非数字/字母字符removeJunk也反转的字符串(它从端部开始,然后在一个时间附加一个字符)。

所以在反转后再次(在reverse)你留下的原始,它会一直声称给定的字符串是回文。

+0

啊,没关系 - 只是注意到你把'reversedCopy'与'workingCopy'比较而不是'stringToTest'。 – 2011-10-28 12:54:37

0

您应该使用Stringreplace(char oldChar, char newChar)方法。 尽管名称暗示只有第一次出现才会被替换,但所有出现的都将被替换。这种方法的优点是不会使用正则表达式,因此效率更高。

所以给一个尝试string.replace(' ', '');

1

如果你只是想删除的开始和结束的空白,你可以使用内置的功能修剪(),例如“abcd”.trim()是“abcd” 如果您想要在任何地方删除它,可以使用带有空白类的replaceAll()方法作为参数,例如“abcd”.replaceAll(“\ W”,“”)。