有限状态机的一个实现

java论坛接了一道题目:
简化文字串
* String TrimSentence( String src )
将原串src中的所有多余空白符(空格,tab,回车等)去掉后,结果就在目标串dst中;引号中的空白符不能去掉,并要考虑引号中的转义字符;两个单词数字之间的多个空白符变成1个空格,单词与符号之间的空白符去掉;假定写入字符的空间已由调用者分配足够。

SELECT /r/n a1, " /"a bc /t"    as   a2/r FROM   c/rWHERE (  a3 = 5   AND a2>1 )
应变成
SELECT a1," /"a bc /t"as a2 FROM c WHERE(a3=5 AND a2>1)

仔细审题的话会发现,其实题目本身还是有点小问题,就是状态不明。但是关系不大,并不太影响解题。

有限自动机的实现并不复杂,但是要写出效率高,易读的程序也不太容易。

public   class  TrimSentence  {
    
final static char[] charsTrim = {
'/n', '/b', '/r', '/f', '/'', '/"' };
    
final static char[] charsTrimC = {
'n', 'b', 'r', 'f', '/'', '/"' };

    
final static char space = ' ';
    
final static char slash = '/';
    
final static char quotation = '"';

    
public static void main(String[] args) {

        String str 
= "SELECT   a1, " /"a bc /t"     as   a2  FROM   c WHERE (  a3 = 5   AND a2>1 ) ";

        System.out.println(trimSentence(str));

    }


    
public static String trimSentence(String str) {
        StringBuffer sb 
= new StringBuffer();
        
char[] charsSrc = new char[str.length()];
        str.getChars(
0, str.length(), charsSrc, 0);
        
boolean spaceFlg = false;
        
boolean slashFlg = false;
        
boolean quotationFlg = false;

        
for (int i = 0; i  < charsSrc.length; i++{
            
char ch1 = charsSrc[i];
            
switch (charsSrc[i]) {
            
case slash:
                slashFlg 
= true;
                spaceFlg 
= false;
                
if (quotationFlg)
                    sb.append(slash);
                
break;
            
case quotation:
                
if (!slashFlg) {
                    quotationFlg 
= !quotationFlg;
                }

                
if (isSpaceDelete(sb, charsSrc[i]))
                    sb.deleteCharAt(sb.length() 
- 1);
                sb.append(charsSrc[i]);
                slashFlg 
= false;
                spaceFlg 
= false;
                
break;

            
case space:
                
if (!spaceFlg) {
                    sb.append(charsSrc[i]);
                    spaceFlg 
= true;
                }

                
break;

            
default:
                
if (quotationFlg) {
                    
if (isCharsTrim(charsSrc[i])) {
                        sb.append(slash);
                        sb.append(getConveredChar(charsSrc[i]));
                    }
 else
                        sb.append(charsSrc[i]);
                }
 else if (isCharsTrim(charsSrc[i])) {
                    charsSrc[i] 
= space;
                    i
--;
                    
continue;
                }
 else {
                    
if (isSpaceDelete(sb, charsSrc[i]))
                        sb.deleteCharAt(sb.length() 
- 1);
                    sb.append(charsSrc[i]);
                }

                slashFlg 
= false;
                spaceFlg 
= false;
                
break;
            }

        }


        
return sb.toString();
    }


    
private static boolean isCharsTrim(char ch) {
        
for (int i = 0; i  < charsTrim.length; i++)
            
if (ch == charsTrim[i])
                
return true;
        
return false;
    }


    
private static char getConveredChar(char ch) {
        
int i;
        
for (i = 0; i  < charsTrim.length; i++)
            
if (ch == charsTrim[i])
                
return charsTrimC[i];
        
return ch;
    }


    
private static boolean isSpaceDelete(StringBuffer sb, char ch) {
        
if (sb.length()  <= 1)
            
return false;
        
if (sb.charAt(sb.length() - 1!= space)
            
return false;
        
return !((Character.isLetter(sb.charAt(sb.length() - 2))  ¦ ¦ Character
                .isDigit(sb.charAt(sb.length() 
- 2))) && (Character
                .isLetter(ch)  ¦ ¦ Character.isDigit(ch)));
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值