2014-01-27 31 views
0

我必須使用switch case語句在JAVA中編寫程序。我需要使用switch case語句檢查下列條件。但我無法比較switch case語句中的值,我怎樣才能做這個任務。如何使用範圍檢查開關case語句

if Avarage - AVG 
AVG ≥ 3.50 「A Pass」 
3.49 ≥ AVG ≥ 3.00 「B Pass」 
2.99 ≥ AVG ≥ 2.50 「C Pass" 
2.49 ≥ AVG ≥ 2.00 「D Pass」 
2.00 ≥ AVG 「Fail」 

回答

2

您可以使用一系列的if語句或者你可以使用一個TreeMap它實現NavigableMap的接口。它可能看起來像:

TreeMap<Double, String> map = new TreeMap<>(); 
map.put(0d, "Fail"); 
map.put(2d, "D Pass"); 
map.put(2.5, "C Pass"); 
map.put(3d, "B Pass"); 
map.put(3.5, "A Pass"); 

System.out.println(map.floorEntry(1.9).getValue()); //Fail 
System.out.println(map.floorEntry(2.49).getValue()); //D 
System.out.println(map.floorEntry(2.5).getValue()); //C 
System.out.println(map.floorEntry(3d).getValue()); //B 
System.out.println(map.floorEntry(3.5).getValue()); //A 

所以回到你的榜樣,你可以簡單地調用return map.floorEntry(AVG).getValue();

性能方面它會非常接近,尤其是隻有5種不同的情況。我把它留給你來決定哪一個更具可讀性。

+0

但是我要做的使用交換機情況下,聲明是一個問題,要求使用Switch case語句。任何人都可以幫助我? – astrodileepa

+1

@astrodileepa如果AVG​​可以是任何雙打,這不能用switch語句寫入。如果只有某些值被授權(比如0,0.5,1,1.5,2,2.5,3,3.5),那麼這是可能的。你需要提供更多信息。 – assylias

+0

是的,我知道我們不能使用switch case語句來比較值。但這是一個具有挑戰性的問題。規則是不使用if..else語句。我不知道如何處理這種情況。這是非常棘手的問題。 – astrodileepa

0

Switch在內部使用跳轉表,這就是爲什麼case語句只能測試確切值和最終值的原因。你可以這樣想象一下:

result = jumpTable[key]; // switch pseudo-code 

這不是你的編譯代碼中找到,但它在一般同樣的想法,所以我用它來回答你的問題。

任何索引不在該數組中無法訪問,所以如果你有長度爲5的數組,你不能做這樣的事:因爲這僅僅是沒有定義

result = jumpTable[2.3]; // impossible in Java 

和Java不能奇蹟般地找出你其實是想向下舍到2.如果你需要編寫能夠理解和轉換的中間值的功能存檔,例如一個簡單的地板功能

result = jumpTable[floor_int(2.3)]; // a solution for a specific case 

會做的伎倆一些情況。很顯然,使用的函數實際上需要適合您的問題,所以如果2.3應該指向索引1,您顯然需要在場景後面使用不同的數學算法。

正如assylias寫道,TreeMap的方法floorEntry是我上面寫的內容的一般化版本,可以用來解決您的問題。

另一種方法是一個標準的if-else鏈是這樣的:

String getTestResult(final double avg) { 
    if (avg >= 3.5) { 
    return "A Pass"; 
    } else if (avg >= 3.0) { 
    return "B Pass"; 
    } else if (avg >= 2.5) { 
    return "C Pass"; 
    } else if (avg >= 2.0) { 
    return "D Pass"; 
    } else { 
    return "Fail"; 
    } 
} 

這使用數的自然順序,其中指出,(顯然)avg不能> = 3.5和< = 3.5在相同的時間。

對於你的情況你應該只寫一個函數gradeToIndex,然後使用替代floor_int功能的如上面我舉的例子,像

index = (int) Math.round((avg - 2.0) * 2.0);