2011-04-21 275 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;