我想在字符串中的每个数字和非数字之间添加一个空格,并且还要在每个非数字之间添加一个空格。
例如: " 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;是我想要执行此操作的字符串)
目前循环因某种原因只是循环无穷大?
答案 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
答案 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)
这里的问题是您之前插入一个位置。让我们手工完成:
input
变得错误13 3+23d-=
。因此,您将在最后3个之前不断添加空格并获得一个有趣的循环。但这并不是全部,即使你用以下方法修复它:
input = input.substring(0, i+1) + " " + input.substring(i+1, input.length());
并且正确地133 +2d-=
事情仍会破裂:
(空格)和+
=&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中提取生成的字符串,这样会更清晰。