【问题标题】:Sorting Algorithm advise if-else排序算法建议 if-else
【发布时间】:2015-12-08 07:05:19
【问题描述】:

我需要一些关于如何对数组中的值进行排序的指导。

所以,我有 2 个Arrays 用于 X 和 Z 加速度计读数。 我想将它们分为 4 个类别:优秀、良好、一般和差。 每个类别都有自己的数组。

在对 X 和 Z arrays 的所有值进行排序并将 1 和 0 的值插入到每个优秀、良好、平均和差数组中之后,我想传递最高值的等级4 个类别(在每个类别数组中添加数据)。

问题是if-else statement 不会进入下一个else if,即使读数小于 1 且大于 -1。 所以到那时,即使我疯狂地摇晃手机,我也总是得到“优秀”的成绩。

范围如下:

  • 优秀:大于 -1 且小于 1
  • 良好:小于 -2 且大于 2
  • 平均:小于 -4 且大于 4
  • 差:小于-6且大于6

for(int i = 0; i < ArrayX.size(); i++){
    //  sumX = (sumX + Integer.parseInt(String.valueOf(ArrayX.get(i))));
    //  sumY = (sumY + Integer.parseInt(String.valueOf(ArrayY.get(i))));
    X = String.valueOf(ArrayX.get(i));
    Y = String.valueOf(ArrayY.get(i));
    Z = String.valueOf(ArrayZ.get(i));
    float valX = Float.parseFloat(X);
    float valZ = Float.parseFloat(Z);


    if(valX<excellentRate||valX>(-excellentRate))
    {
        ArrayPoor.add(0);
        ArrayAverage.add(0);
        ArrayGood.add(0);
        ArrayExcellent.add(1);
    }
    else if(valX<=goodRate||valX>=(-goodRate)){
        ArrayPoor.add(0);
        ArrayAverage.add(0);
        ArrayGood.add(1);
        ArrayExcellent.add(0);
    }
    else if(valX<=averageRate||valX>=(-averageRate)){
        ArrayPoor.add(0);
        ArrayAverage.add(1);
        ArrayGood.add(0);
        ArrayExcellent.add(0);
    }
    else if(valX<poorRate||valX>(-poorRate)){
        ArrayPoor.add(1);
        ArrayAverage.add(0);
        ArrayGood.add(0);
        ArrayExcellent.add(0);
    }


    if(valZ<(0.00f)||valZ>0.00f)
    {
        ArrayPoor.add(0);
        ArrayAverage.add(0);
        ArrayGood.add(0);
        ArrayExcellent.add(1);
    }
    else if(valZ<=(-2.00f)||valZ>=2.00f){
        ArrayPoor.add(0);
        ArrayAverage.add(0);
        ArrayGood.add(1);
        ArrayExcellent.add(0);
    }
    else if(valZ<=(-4.00f)||valZ>=4.00f){
        ArrayPoor.add(0);
        ArrayAverage.add(1);
        ArrayGood.add(0);
        ArrayExcellent.add(0);
    }
    else if(valZ<(-6.00f)||valZ>4.00f){
        ArrayPoor.add(1);
        ArrayAverage.add(0);
        ArrayGood.add(0);
        ArrayExcellent.add(0);
    }



    //codes for sending testSet Details             
    System.out.println(">>>>>>>>>>>>>>>>>>> "+ " TS= " +TS_ID + " TSA= "+ TSA_ID  + X + " " + Y + " " + Z);
    String jsonOutput = "http://172.20.34.112/IBBTS_WebService_MobileAndDevice/Service1.asmx/setAccReadings";               

    if (isOnline()) {
        requestAccelData(jsonOutput);
    }else {
        Toast.makeText(ResultSend.this, "Network isn't available", Toast.LENGTH_LONG).show();
    }
}


for (int j=0; j<ArrayExcellent.size(); j++){
    sumPoor = sumPoor +Integer.parseInt(String.valueOf(ArrayPoor.get(j)));
    sumAverage = sumAverage + Integer.parseInt(String.valueOf(ArrayAverage.get(j)));
    sumGood = sumGood + Integer.parseInt(String.valueOf(ArrayGood.get(j)));
    sumExcellent = sumExcellent + Integer.parseInt(String.valueOf(ArrayExcellent.get(j)));
}

if(sumExcellent>=sumGood && sumExcellent>=sumAverage && sumExcellent>=sumPoor )
    grade ="Excellent";
else if(sumGood>=sumExcellent && sumGood>=sumAverage && sumGood>=sumPoor){
    grade ="Good";
}
else if(sumAverage>=sumExcellent && sumAverage>=sumGood && sumAverage>=sumPoor){
    grade ="Average";
}
else if(sumPoor>=sumExcellent && sumPoor>=sumGood && sumPoor>=sumAverage){
    grade ="Poor";
}

Intent intSummary = new Intent(ResultSend.this, ResultSummary.class);
intSummary.putExtra("gradePassed", grade);
intSummary.putExtra("TestName", TestName);
startActivity(intSummary);
}   

我也尝试过类似这样的其他方法:

checker = compare(valX, excellentRateX);
if(checker == 1){
    ArrayPoor.add(0);
    ArrayAverage.add(0);
    ArrayGood.add(0);
    ArrayExcellent.add(1);
    checker = 0;
    checker = compare(valX, goodRateX);
}
else if(checker == -1){
    checker = compare(valX, goodRateX);
}
else if(checker == 1){
    ArrayPoor.add(0);
    ArrayAverage.add(0);
    ArrayGood.add(1);
    ArrayExcellent.add(0);
    checker = 0;
    checker = compare(valX, averageRateX);
}
else if(checker == -1){
    checker = compare(valX, averageRateX);
}
else if(checker == 1){
    ArrayPoor.add(0);
    ArrayAverage.add(1);
    ArrayGood.add(0);
    ArrayExcellent.add(0);
    checker = 0;
    checker = compare(valX, poorRateX);
}
else if(checker == -1){
    checker = compare(valX, poorRateX);
}
else if(checker == 1){
    ArrayPoor.add(1);
    ArrayAverage.add(0);
    ArrayGood.add(0);
    ArrayExcellent.add(0);
    checker = 0;
}


checker = compare(valZ, excellentRateZ);
if(checker == 1){
    ArrayPoor.add(0);
    ArrayAverage.add(0);
    ArrayGood.add(0);
    ArrayExcellent.add(1);
    checker = 0;
    checker = compare(valZ, goodRateZ);
}
else if(checker == -1){
    checker = compare(valZ, goodRateX);
}
else if(checker == 1){
    ArrayPoor.add(0);
    ArrayAverage.add(0);
    ArrayGood.add(1);
    ArrayExcellent.add(0);
    checker = 0;
    checker = compare(valZ, averageRateZ);
}
else if(checker == -1){
    checker = compare(valZ, averageRateZ);
}
else if(checker == 1){
    ArrayPoor.add(0);
    ArrayAverage.add(1);
    ArrayGood.add(0);
    ArrayExcellent.add(0);
    checker = 0;
    checker = compare(valZ, poorRateZ);
}
else if(checker == -1){
    checker = compare(valZ, poorRateZ);
}
else if(checker == 1){
    ArrayPoor.add(1);
    ArrayAverage.add(0);
    ArrayGood.add(0);
    ArrayExcellent.add(0);
    checker = 0;
} 

public static int compare(float f1, float f2) {
   if (f1 < f2 && f1 > -f2){
        return 1;
        } // value is within the specifications
   else{
        return -1;
        } // value is outside the specifications
}

根据以下建议编辑了代码,现在可以正常工作了!

            if(valX <excellentRateX && valX >(-excellentRateX))
            {
                ArrayPoor.add(0);
                ArrayAverage.add(0);
                ArrayGood.add(0);
                ArrayExcellent.add(1);
            }
            else if(valX <= goodRateX && valX >= (-goodRateX)){
                ArrayPoor.add(0);
                ArrayAverage.add(0);
                ArrayGood.add(1);
                ArrayExcellent.add(0);
            }
            else if(valX <= averageRateX && valX>=(-averageRateX)){
                ArrayPoor.add(0);
                ArrayAverage.add(1);
                ArrayGood.add(0);
                ArrayExcellent.add(0);
            }
            else if(valX <= poorRateX && valX >= (-poorRateX)){
                ArrayPoor.add(1);
                ArrayAverage.add(0);
                ArrayGood.add(0);
                ArrayExcellent.add(0);
            }
            else {
                ArrayPoor.add(1);
                ArrayAverage.add(0);
                ArrayGood.add(0);
                ArrayExcellent.add(0);
            }


            if(valZ<excellentRateZ  && valZ>-excellentRateZ)
            {
                ArrayPoor.add(0);
                ArrayAverage.add(0);
                ArrayGood.add(0);
                ArrayExcellent.add(1);
            }
            else if(valZ <= goodRateZ && valZ >= (-goodRateZ)){
                ArrayPoor.add(0);
                ArrayAverage.add(0);
                ArrayGood.add(1);
                ArrayExcellent.add(0);
            }
            else if(valZ <= averageRateZ && valZ>=(-averageRateZ)){
                ArrayPoor.add(0);
                ArrayAverage.add(1);
                ArrayGood.add(0);
                ArrayExcellent.add(0);
            }
            else if(valZ < poorRateZ && valZ>(-poorRateZ)){
                ArrayPoor.add(1);
                ArrayAverage.add(0);
                ArrayGood.add(0);
                ArrayExcellent.add(0);
            } 
            else {
                ArrayPoor.add(1);
                ArrayAverage.add(0);
                ArrayGood.add(0);
                ArrayExcellent.add(0);
            }

【问题讨论】:

  • Poor: less than -6 and more than 6 你的代码说的不同,它比-6 少,但会忽略第二个条件valZ&gt;4.00f,因为它已经被前一个条件覆盖了。此外,一切都会被您的第一个 if 条件捕获。 (valZ&lt;(0.00f)||valZ&gt;0.00f) 因为此条件还包括以下条件。
  • 我不明白...如果值为1.5呢?
  • 另外……你的好、一般和差的条件永远不会得到满足。一个数怎么会小于-2and大于2?

标签: java android arrays algorithm if-statement


【解决方案1】:

在第一个代码 sn-p 中,我可以看到以下 if 条件:

 if(valX<excellentRate||valX>(-excellentRate))

如果是excellentRate = 1,那么它将被解释为

如果 valX 小于 1 或 valX 大于 -1

由于每个实数都是“小于 1 或大于 -1”,因此这个条件永远为真。

你应该使用:

if(valX<excellentRate && valX>(-excellentRate))

对其他 if 语句做同样的事情。

附: :我的声誉很低,所以无法在评论中指出这一点,因此我正在写一个答案。

【讨论】:

  • 您好,感谢您的赐教!现在终于可以工作了!将更新顶部的代码。
  • 如果它对您有用,请接受此答案,以便其他人知道您的问题已得到解答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 2019-06-24
  • 1970-01-01
  • 2011-06-04
相关资源
最近更新 更多