如何在每个int和非int值之间添加空格?

时间:2016-11-18 14:15:02

标签: java

我想在字符串中的每个数字和非数字之间添加一个空格,并且还要在每个非数字之间添加一个空格。

例如: " 133 + 23D - =" ➟" 133 + 23 d - ="

这是我的尝试:

for(int i=0; i<input.length();i++){
    if((Character.isDigit(input.charAt(i)) && !Character.isDigit(input.charAt(i+1))) || (!Character.isDigit(input.charAt(i)) && Character.isDigit(input.charAt(i+1))) || (!Character.isDigit(input.charAt(i)) && !Character.isDigit(input.charAt(i+1)))){
        input = input.substring(0, i) + " " + input.substring(i, input.length());
    }   
}

(其中&#34;输入&#34;是我想要执行此操作的字符串)

目前循环因某种原因只是循环无穷大?

5 个答案:

答案 0 :(得分:4)

您在循环中重新分配input并延长其长度,同时还使用长度作为终止条件。因此,您还将考虑新添加的空格,这将触发另一个要插入的空格等。

出于性能原因,您应该将结果存储在单独的变量(理想情况下为input)中,而不是直接修改StringBuilder

此外,由于您的i正在从0运行到length-1,因此在尝试在该循环的最后一次迭代中访问charAt(i+1)时,您将获得IndexOutOfBoundsException。 / p>

答案 1 :(得分:2)

您可以使用正则表达式检测非数字字符public class DrawingView extends View { //drawing path private Path drawPath; //drawing and canvas paint private Paint drawPaint, canvasPaint; //initial color private int paintColor = 0xFFFF0000, paintAlpha = 255; //canvas private Canvas drawCanvas; //canvas bitmap private Bitmap canvasBitmap; //constructor public DrawingView(Context context, AttributeSet attrs){ super(context, attrs); setupDrawing(); } //prepare drawing private void setupDrawing(){ drawPath = new Path(); drawPaint = new Paint(); drawPaint.setColor(paintColor); drawPaint.setAntiAlias(true); drawPaint.setStrokeWidth(50); drawPaint.setStyle(Paint.Style.STROKE); drawPaint.setStrokeJoin(Paint.Join.ROUND); drawPaint.setStrokeCap(Paint.Cap.ROUND); canvasPaint = new Paint(Paint.DITHER_FLAG); } //view assigned size @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); drawCanvas = new Canvas(canvasBitmap); } //draw view @Override protected void onDraw(Canvas canvas) { canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint); canvas.drawPath(drawPath, drawPaint); } //respond to touch interaction @Override public boolean onTouchEvent(MotionEvent event) { float touchX = event.getX(); float touchY = event.getY(); //respond to down, move and up events switch (event.getAction()) { case MotionEvent.ACTION_DOWN: drawPath.moveTo(touchX, touchY); break; case MotionEvent.ACTION_MOVE: drawPath.lineTo(touchX, touchY); break; case MotionEvent.ACTION_UP: drawPath.lineTo(touchX, touchY); drawCanvas.drawPath(drawPath, drawPaint); drawPath.reset(); break; default: return false; } //redraw invalidate(); return true; } //return current alpha public int getPaintAlpha(){ return Math.round((float)paintAlpha/255*100); } //set alpha public void setPaintAlpha(int newAlpha){ paintAlpha=Math.round((float)newAlpha/100*255); drawPaint.setColor(paintColor); drawPaint.setAlpha(paintAlpha); } } 之前和之后的位置。

\\D

Ideone Demo

答案 2 :(得分:1)

您可以使用正则表达式。

String s = "133+23d-=";
s = s.replaceAll("(\\d+)", "$1 "); //finds every consecutive digits and puts a space after them
s = s.replaceAll("([-a-zA-Z]+)", "$1 "); //finds every consecutive characters and puts a space after them

答案 3 :(得分:0)

  

我想在a中的每个数字和非数字之间添加一个空格   字符串。

     

例如:&#34; 133 + 23d - =&#34; ➟&#34; 133 + 23 d - =&#34;

正如您所描述的那样,我认为结果应该是&#34; 133 + 23 d - =&#34;

基本上这应该是算法

        String input = "133+23d-=";
        StringBuilder result = new StringBuilder();
        boolean number = false;
        for( int i = 0; i < input.length(); i++ ){
            if( input.charAt(i) < '0' || input.charAt(i) > '9' ){ // not a digit
                if( number ){
                    result.append(" ");
                }
                number = false;
            }else{
                if( !number ){
                    result.append(" ");
                }
                number = true;
            }
            result.append(input.charAt(i));
        }

        System.out.println(result.toString());

答案 4 :(得分:0)

这里的问题是您之前插入一个位置。让我们手工完成:

  • i = 0:进程1和3 - 两个数字都没有改变
  • i = 1:进程3和3 - 两个数字都没有改变
  • i = 2:处理3和+ - 数字且无数字=&gt;在 i 位置添加空格! input变得错误13 3+23d-=。因此,您将在最后3个之前不断添加空格并获得一个有趣的循环。

但这并不是全部,即使你用以下方法修复它:

input = input.substring(0, i+1) + " " + input.substring(i+1, input.length());

并且正确地133 +2d-=事情仍会破裂:

  • i = 3:处理(空格)和+ =&gt;两者都不是数字,你仍然添加一个空格。

这里再次获得在+之前添加空格的无限循环。

地狱隐藏在细节中!添加空格后,您必须跳过它,并且必须在最后一个位置停止,因为您稍后使用input.charAt(i+1)

您的固定代码变为:

    for (int i=0; i<input.length() - 1; i++) {
        if ((Character.isDigit(input.charAt(i)) && !Character.isDigit(input.charAt(i + 1))) || (!Character.isDigit(input.charAt(i)) && Character.isDigit(input.charAt(i + 1))) || (!Character.isDigit(input.charAt(i)) && !Character.isDigit(input.charAt(i + 1)))) {
            input = input.substring(0, i+1) + " " + input.substring(i+1, input.length());
            i += 1;
        }
    }

TL / DR:如果您只是在调试器下运行循环,那么所有这些都是不言而喻的。 Eclipse的Netbeans都包含一个不错的。

但这不是全部。您反复重新分配输入字符串。即使在早期开发阶段应该避免小案例优化,这也是。浏览输入字符串,将原始字符和空格添加到StringBuilder中,最后只从StringBuilder中提取生成的字符串,这样会更清晰。