字符串连接

时间:2011-11-16 20:32:24

标签: java

我有以下代码,回报令我困惑。我是java的新手,并不确定它为什么会以它的方式返回。任何帮助都会很棒。

如果数据有PE846A846,则会返回engineamboengineambo。我希望只返回engineambo

    String soundString = "";

    if (data.contains("PE846")) {
        soundString += "engine";
        betaString = "Engine : ";
        sign = engine;
    }
    if (data.contains("A846")) {
        soundString += "ambo";
        betaString += "Ambo : ";
        sign = ambo;
    }
    if (data.contains("MD846")) {
        soundString += "medic";
        betaString += "Medic";
        sign = medic;
    }

    log.info(betaString + " Alerted");

    {
        new AudioPlayer("sounds/" + soundString + ".wav").start();
        log.info(soundString);
    }   

4 个答案:

答案 0 :(得分:5)

您可以尝试逐行搜索代码。如果它包含PE846和A846(但不包含MD846),那么它将运行前两个条件块,从而执行如下:

if (data.contains("PE846")){   // The string does contain PE846, per your question
    soundString += "engine";   // soundString = "" + "engine" = "engine"
    betaString = "Engine : ";  // betaString = "Engine : "
    sign = engine;             // sign = engine
}
if (data.contains("A846")){    // The string does contain A846, per your question
    soundString += "ambo";     // soundString = "engine" + "ambo"
    betaString += "Ambo : ";   // betaString = "Engine : " + "Ambo : " = "Engine : Ambo : "
    sign = ambo;               // sign = ambo (overwriting the previous value, "engine")
}
if (data.contains("MD846")){   // The string does not contain MD846, per your question
    soundString += "medic";    // not executed
    betaString += "Medic";     // not executed
    sign = medic;              // not executed
}

log.info(betaString + " Alerted");  // betaString + " Alerted" => "Engine : Ambo : Alerted"
{
    new AudioPlayer("sounds/"+ soundString +".wav").start();
    log.info(soundString);          // soundString => "engineambo"
} 

答案 1 :(得分:1)

尝试重写代码,使其不具有经常重新分配的变量。 final关键字将阻止变量的第二次分配,这将消除检查整个程序流以查看先前的分配是否对后面的分配产生影响的需要。此外,请避免使用+=,除非您真的想将数据添加到现有数据中。

此外,如果您将某些内容设置为“正确的值”,则如果无法使用其他值,则不要继续更改它。

这样的东西
String mystring;

if (data.contains("MD846")) {
  mystring = "medic";
} else if (data.contains("A846")) {
  mystring = "ambo";
}
由于数据设置为“MD846A846”,

无法将mystring设置为“medicambo”。

答案 2 :(得分:0)

如果您的数据包含PE846-A846,它只包含PE,A和PE&&答:您应首先检查PE&&在一个if语句中,如果失败,则单独检查每个语句

答案 3 :(得分:0)

方法contains不适合查找子字符串,因为它需要CharSequence个对象而不是String个对象。

在这种情况下,最好的选择是从类String中替换contains的{​​{1}}方法。