2011-10-31 47 views
5

這是一個非常奇怪的問題。在Java中不使用if語句

最終我試圖寫一個程序轉換是發生在Java源代碼,並將其轉換,使得它不使用(除其他事項外)

  • 陣列
  • 循環
  • 用戶定義的方法
  • 如果報表

這是我給自己定一個挑戰,經過我的老師告訴我,這如果不使用這些東西就不可能寫出一個程序。

我大部分的工作,包括函數內聯和數組替換,但我不能解決如何管理if語句。

在C++中我會使用標籤和gotos,也許?:,但Java不支持GOTO語句。

我的問題是這樣的: 給出一段代碼,

if(CONDITION) 
{ 
    //More code in here 
} 

如何可以改變它,使得它在功能上是一樣的,但是不使用,如果關鍵字。請注意,循環結構也不存在問題。

鑑於此,可以很容易地創建else和else if語句。 但是我也不確定如何使用它創建循環,因爲沒有GOTO語句和方法是不可能的。

編輯: 請注意,開關也不準,也不是遞歸(通過的事實,你不能定義用戶的方法,以及遞歸主要功能不會與每一個程序的工作排除了) ?:運算符不適用於所有情況。 AFAIK不能用?調用void函數,因爲它想要將一個值作爲其操作的一部分。

這些條件來自IB計算機科學SL要求的課程,我將HL和作爲一個班級,我們正在嘲笑包含'if'語句的SL'掌握'因素(如果事實3/15是'用戶定義的方法,帶參數和返回類型)這個挑戰是有效的失敗SL中的精通測試,同時仍然產生正確運行的程序。

答:(通過bdares)

String result = (CONDITION)?"0":"A"; 
try{ 
    Integer.parseInt(result); 
    //Condition is true 
} catch(NumberFormatException e){ 
    //Condition is false 
} 
+0

使用goto和標籤的循環仍然是一個循環,它只是使用另一種語法。爲了真正擺脫循環,你需要展開它們,即把循環中的語句順序地執行。這對於無限循環是不可能的(例如'while(1)'。) –

+1

@JoachimPileborg不正確;他不排除使用預先編寫的庫的循環,所以他(理論上)可以寫入java.util.Loop(myObject.class,10);如果存在這樣的庫。就目前而言,他可以從Collection對象中解決一個解決方案。 – bdares

+0

http://www.antiifcampaign。com /但是這是關於改進的OOP(通過更好的設計去除緊張,隱藏的邏輯嵌套爲IF) – earcam

回答

2
if(A) { 
    X(); 
} 
else{ 
    Y(); 
} 

可以轉換爲:

A?X():Y(); 

您可以嵌套這些你想要的,或者乾脆刪除:的一側,並得到一個簡單的if。條件很簡單。

如果你希望它爲void的方法工作,這裏有一個辦法:

String result = A?"0":"A"; 
try{ 
    Integer.parseInt(result); 
    X(); 
} catch(NumberFormatException e){ 
    Y(); 
} 
+0

那麼我可以使用LinkedLists而不是數組。而?:不能用於複雜的if語句,而不必在var =(condition)前加上每行的前綴?/*在這裏調用一個函數或者什麼* /:var – James

+0

他並不排除遞歸。 – stivlo

+0

@stivlo我想不......如果你被允許使用「庫函數」(我會假設SE6或SE7),那麼有很多方法來循環任意代碼。我誤解了他的限制。 – bdares

2

您可以使用條件運算符和一個開關:

switch(CONDITION ? 1 : 0) 
{ 
    case 1: 
     //... true code 
     break; 
    case 0: 
     //... false code 
     break; 
} 

對於循環,你可以展開你的代碼到某些預定義的最大值,並根據某些條件使用帶標籤的休息提前跳出展開的代碼。您可以使用break來結束Java中的任何代碼塊,而不僅僅是循環。

Java語言沒有轉到,但虛擬機具有它,所以您當然也可以直接生成JVM指令,但這與常規Java編譯器沒有多大區別,後者也將所有if循環轉換爲跳轉指令。

+0

switch只接受'int'作爲參數(在java 7中也是'String') 。 –

+0

謝謝,但switch語句是另一個構建「黑名單」。我應該提到,將更新問題 – James

1

我不確定是否可以在不使用if語句的情況下編寫完整有用的程序。不過,我認爲你的老師可能會看到的是,你可以編寫代碼,通過使用更加面向對象的方法代替if語句來遵循相同的「邏輯」路徑。例如:

public interface Moveable { 
    void move(int x, int y); 
} 

public class Ball implements Moveable { 
    private int x; 
    private int y; 

    public void move(int x, int y) { 
    this.x = x; 
    this.y = y; 
    } 
} 

public class NullMoveable { 
    public void move(int x, int y) { 
    // Do nothing. 
    } 
} 

...,然後在主應用程序代碼:

Moveable mv = new NullMoveable();  
// Move object; don't care if it's a Ball or a NullMoveable 
// so no need to explicitly check with an if-statement. 
mv.move(10, 50); 

這裏的原則是,較少可能的路徑有在你的代碼(由於if語句)更容易它是測試和維護。

+0

我熟悉OOP並且有編程經驗。然而,Java遠非我的主要語言。作爲一個側面說明,轉換器當前支持刪除用戶類和結構,不再需要OOP :) – James

0

在某些情況下,您可以使用位操作。例如:

if(x > 0) // positive number 
{ 
    isPositive = true; 
} 
else // negative number 
{ 
    isPositive = flase; 
} 

等同於:

isPositive = (x >> 31) == 0; 

編輯:

這只是一個例子,當然你也可以做更復雜的位操作與一個聲明,而不是使用一堆if語句來做這件事。

+0

有趣的是,當你可以寫'isPositive = x> 0;' – stivlo

+0

@stivlo時,這取決於整數的大小,這只是一個例如,當然你可以用一個語句做更復雜的位操作,而不是使用一堆if語句來完成。 –

0

如果你被允許使用匿名內部類(這些可能歸類爲用戶自定義的方法,但我會告訴你是法官):

if(COND) { 
    X(); 
} else { 
    Y(); 
} 

變爲:

ifReplacement(COND, 
       new Runnable() { public void run() { X();}}, 
       new Runnable() { public void run() { Y();}}); 

與簽名:

public static void ifReplacement(boolean condition, 
           Runnable ifBranch, 
           Runnable elseBranch) 

當然,JDK8 lambda表達式將使這好得多:

ifReplacement(COND,()->X(),()->Y());