输出在START循环和java循环结束时流失

时间:2015-07-02 06:45:08

标签: java arrays string while-loop

我正在编写一个代码,用于将信号从一种形式转换为另一种形式。 我的代码运行良好,但最终失败。

INPUT: String [] test = {"B","100","B","B","2","3","100","B","200","B","3","17","B","10" };

所需产出:B / 101 B / 1 B / 106 B / 201 B / 21 B / 11

GOT OUTPUT:B / 1 B / 101 B / 1 B / 106 B / 201 B / 21

所需输出和得到输出的比较
         在输出中不需要第一项B / 1。          在所需输出的末尾缺少B / 11。

算法:“B”替换为“B /”,然后添加出现在字符串中的数字,如“2”,“3”,“100”,得到105和“1”  将被添加为“B”因此106,最终结果变为'B / 106'。

我是java和编程的新手。我需要帮助来获得所需的输出。

这是我的代码:

public class SignalConversion { 

public static void main(String args[]) {

String [] test  ={"B","100","B","B","2","3","100","B","200","B","3","17","B","10" };

int i=0; int x=test.length;

String netSignal="";
int total=0;

while(!(x==0)){

        StringBuilder sb_matra= new StringBuilder();
        StringBuilder sb_sur= new StringBuilder(); 

        if(!test[i].equals("B")) {   

            total=total+(Integer.valueOf(test[i])); 
        }
        else {
            total=total+1;
            sb_sur.append(test[i]+"/"+Integer.toString(total)+"  " );
            total=0; 
        } 

        netSignal=sb_sur.toString()+sb_matra.toString();

        System.out.printf(netSignal);   
        i++;
        x--;
    }
}
}

3 个答案:

答案 0 :(得分:1)

当你遇到“B”时,你应该开始对它后面的数字求和,但只在遇到下一个“B”时输出结果。这就是你最终遇到问题的原因。在计算它应该附带的数字之前,你会在遇到它时打印第一个“B”。

同样,在循环结束时,你应该添加一个带有最后总和的附加B.

这是一种潜在的方式(我认为这个循环比你的简单):

StringBuilder sb_sur= new StringBuilder(); 
boolean first = true;
for (int i = 0; i < test.length; i++) {
    if(!test[i].equals("B")) {   
        total=total+(Integer.valueOf(test[i])); 
    } else {
        if (!first) {
          total=total+1;
          sb_sur.append("B/"+Integer.toString(total)+"  " );
          total=0; 
        }
        first = false;
    }  
}
total=total+1;
// account for the last B
sb_sur.append("B/"+Integer.toString(total)+"  " );

答案 1 :(得分:1)

我会这样做,

public static void main(String[] args) {
    String[] test = { "B", "100", "B", "B", "2", "3", "100", "B", "200",
            "B", "3", "17", "B", "10" };

    boolean foundB = false;
    int total = 0;
    for(int i=0;i<test.length;i++){

        if(foundB){
            if(test[i].equals("B")){
                System.out.print("B/"+(total+1)+" ");
                total=0;
            }else{
                total += Integer.parseInt(test[i]);
            }

            if(i==(test.length-1)){
                System.out.print("B/"+(total+1)+" "); // The last B
            }
        }
        if(test[i].equals("B")){
            foundB = true; // start counting only after you find a B
        }
    }
}

答案 2 :(得分:0)

哦,我看到Eran做了几乎同样的尝试。

    String[] test = { "B", "100", "B", "B", "2", "3", "100", "B", "200", "B", "3", "17", "B", "10" };

    List<String> resultTest = new ArrayList<>();
    int value = 0;
    for (int i = 0; i < test.length; i++) {
        if (i != 0 && test[i].equalsIgnoreCase("B")) {
            resultTest.add("B\\" + (value + 1));
            value = 0;
        } else {
            if (!test[i].equalsIgnoreCase("B")) {
                value += Integer.parseInt(test[i]);
            }
        }
    }
    resultTest.add("B\\" + (value + 1));
    resultTest.forEach(System.out::println);