存储StringBuffer

时间:2011-04-28 14:41:39

标签: java

我的Class中有一个StringBuffer,如果在IF语句中满足条件并删除某些字符并打印该语句。但是,这可以重复多次。如果满足第二个条件,则第一个语句将打印出来而不删除任何字符。

有解决方法吗?以下是我的代码。

    if (status == 1 && item == item1[1]){
        item1[1] = "*"; 
        w = sb1.append(item1[1]+"["+item2[1]+"] ");
        sb1.delete(1,4);
    }else if (status == 1 && item == item1[2]){
        item1[2] = "*";
        x = sb1.append(item1[2]+"["+item2[2]+"] ");
        sb1.delete(1,4);
    }else if(status == 1 && item == item1[3]){
        item1[3] = "*";
        y = sb1.append(item1[3]+"["+item2[3]+"] ");
        sb1.delete(1,4);   
    }  
    return w.toString()+x.toString()+y.toString()+z.toString();

我想要实现的目标如下: 我有一个由以下内容组成的toString:

item1 [1] +“[”item2 [1]“]”+ item1 [2] +“[”+ tem2 [2] +“]”

我想这样做:

如果item1被标记为已拍摄,则会将其更改为“*”并删除它周围的item2 [1]和[],然后将其返回为:

     eg: item1[2] = x 
         item2[2] = 1


    * x[1]

( * used to be item1[1] )

但如果循环再次通过,我当前的类执行此操作:          * [] * [1] 我希望它是:  * * 当循环完成时

2 个答案:

答案 0 :(得分:2)

一般问题:item看起来像Stringitem[]就像String[]不要对字符串使用==,偶尔会产生意外结果。请改用equals()

if (status == 1 && item.equals(item1[1])) {

也可以将此模式用于其他条件检查。

(并为item == null添加一个现在必要的测试/处理程序)


另一项改进:将StringBuffer替换为StringBuilder,并且在将字符串传递给追加时不会连接字符串。不是为了纠正错误,而是为了提供更好的性能:

 w = sb1.append(item1[1]).append("[").append(item2[1]).append("] ");

答案 1 :(得分:0)

您的代码看起来很可疑。让我们拉出3次测试是否'status == 1'(变量中是否有一个隐藏的布尔值,它试图出来?)。并在代币之间放一些新鲜空气,使眼睛的工作更容易分开:

if (status == 1)
{
    if (item.equals (item1[1])) 
    {
        item1[1] = "*"; 
        w = sb1.append (item1[1] + "[" + item2[1] + "] ");
        sb1.delete (1, 4);
    } 
    else if (item.equals (item1[2]))
    {
        item1[2] = "*";
        x = sb1.append (item1[2] + "[" + item2[2] + "] ");
        sb1.delete (1, 4);
    }
    else if (item.equals (item1[3])) 
    {
        item1[3] = "*";
        y = sb1.append (item1[3] + "[" + item2[3] + "] ");
        sb1.delete (1, 4);   
    }
}  
return (w.append (x). append (y). append (z)).toString ();
// 

看起来像3次相同的语句,只是迭代1,2,3和w,x,y。我在最后一行也使用了append,只是在最终结果上放了'toString()'。

让我们从3个语句中循环:

if (status == 1)
{
    for (int i = 1; i < 4; ++i)
    {
        if (item.equals (item1[i])) 
        {
            item1[i] = "*"; 
            w = sb1.append (item1[i] + "[" + item2[i] + "] ");
            sb1.delete (1, 4);
        }
    }
}  
return (w.append (w). append (w). append (w)).toString ();

根据您的代码,副作用,线程等,这可能会导致一些不同,但我不这么认为。特别是我不知道w,x,y是默认的,如果没有在该代码部分中分配的话。并且代码看起来,好像item只是等于item1 [1]或item1 [2]或item1 [3]。但它可能等于所有3,然后循环将达到3次而不是1次。

然而,item1 / item2是代码气味。它闻起来像2-dim-array或没有很好地考虑面向对象(item.color,item.name或类似的东西)。