2011-04-21 264 views
3

我寫了下面的構造函數來獲取2個參數,如果一個值(x或y)是負數,它將被初始化爲零。如果條件最小化

public Point1 (int x , int y) 
    { 
     //if one or more of the point values is <0 , the constructor will state a zero value. 
     if (x < 0) 
     { 
      _x = 0; 
     } 
     else 
      _x=x; 
     if (y < 0) 
     { 
      _y = 0; 
     } 
     else 
      _y = y; 
    } 

我只需要它是極簡主義,如果它可以...

+1

哇。我不認爲我曾經看到很多答案立即出現。 – 2011-04-21 18:01:07

+3

我希望你得到足夠的答案。 – 2011-04-21 18:01:23

+1

雖然下面的答案中提出的語法無疑將是「極簡主義」......你爲什麼在意?你在這裏所做的任何事情都不需要花費太多的時間,而且你所做的事情完全沒有問題。不管你使用什麼語法,你都需要兩個比較和兩個任務。 – 2011-04-21 18:02:23

回答

9
_x = Math.max(x,0); 
_y = Math.max(y,0); 
+1

不挑剔,但你只是通過分支降低效率;)儘管使用靜態方法,編譯器可能會優化它。 – 2011-04-21 18:06:57

+6

我很高興看到基準測試顯示它在現實世界環境中的差異。 :)另外,問題是關於如何「最小化如果條件」和我的片段具有零「if」語句或任何種類的條件。但是你的意見被記錄下來,並表示讚賞。 – 2011-04-21 18:10:31

+0

我沒有說它會有任何*可測量*的差異,但我保證你*有*差異;)在OP的問題的評論中看到我的答案 - 國際海事組織我認爲他這樣問這是愚蠢的首先是問題,它反映了一個不成熟的優化嘗試,這實際上是我最初的口舌和評論的觀點; 「if」真的沒什麼問題(我個人使用三元組,但這只是一種風格)。 – 2011-04-21 18:14:34

2
_x = (x<0)?0:x ; 
_y = (y<0)?0:y ; 
+1

我會刪除括號並使用空格。 – 2011-04-21 19:03:04

0

寫一個函數,NegativeToZero並使用它:

_x = NegativeToZero(x); 
_y = NegativeToZero(y); 
4
_x = Math.max(0, x); 
_y = Math.max(0, x); 

_x = x < 0 ? 0 : x; 
_y = y < 0 ? 0 : y; 
0

該代碼非常簡單。如果你正在尋找更清晰的代碼(這取決於開發者)我總是用三元運營商簡單的if-else語句:

_x = (x < 0) ? 0 : x; 
_y = (y < 0) ? 0 : y; 

這只是說,如果x < 0,使用0,否則用x

1

......怎麼

_x = (x < 0) ? 0 : x; 
_y = (y < 0) ? 0 : y; 
1

這可能會爲你工作:

public Point1 (int x, int y) 
{ 
    _x = x < 0 ? 0 : x; 
    _y = y < 0 ? 0 : y; 
} 
1

嘗試:

_x = Math.max(0, x); 
_y = Math.max(0, y); 
0
public Point1 (int x , int y) { 
    if(x < 0) x = 0; 
    if(y < 0) y = 0; 

    _x = x; 
    _y = y; 

} 

public Point1 (int x , int y) { 
_x = x < 0 ? 0 : x; 
_y = y < 0 ? 0 : y; 

}

1

如果你想使用的字符儘可能少的,也許是這樣的:

public Point1(int x, int y) { 
    _x = Math.max(0,x); 
    _y = Math.max(0,y); 
} 
0

我」什麼d實際上更喜歡:

public Point1(int x, int y) { 
    this.x = nonnegative(x); 
    this.y = nonnegative(y); 
} 

其中:

public static int nonegative(int value) { 
    if (value < 0) { 
     throw new IllegalStateException(
      value + " is negative" 
     ); 
    } 
    return value; 
} 

如果隱藏了構造函數和添加靜態創建方法,那就更好了(如果一點更詳細)。當然,一個負面的地毯清掃創作方法不應該被用於構造。

0

這只是爲了好玩(沒有條件,當然沒有效率)。它減少如果條件句雖然:)

int temp = (x&(~Integer.MAX_VALUE))>>>(Integer.SIZE - 6);  
_x = (x >>> (temp - (temp >> 5))) - (temp >> 5); 

略有改善:

int temp = (x&(~Integer.MAX_VALUE))>>>(Integer.SIZE - 6);  
_x = (x << (temp - (temp >> 5))) & Integer.MAX_VALUE;