日期:2014-05-20  浏览次数:20668 次

返回3个数中间数的索引
今天看jdk源码的ArrayList时,看到有个med3方法,是返回3个数的中间值:
/**
  * Returns the index of the median of the three indexed longs.
  */
  private static int med3(long x[], int a, int b, int c) {
return (x[a] < x[b] ?
(x[b] < x[c] ? b : x[a] < x[c] ? c : a) :
(x[b] > x[c] ? b : x[a] > x[c] ? c : a));
  }
感觉这个方法很好,但是我比较笨,谁能帮我解释下这个方法的逻辑是什么,还有就是有比这更好的方法返回中间值么?
菜鸟求解

------解决方案--------------------
先判断x[a] < x[b]是否为真;真的话就执行(x[b] < x[c] ? b : x[a] < x[c] ? c : a);否的话就执行(x[b] > x[c] ? b : x[a] > x[c] ? c : a);

x[b] < x[c] ? b : x[a] < x[c] ? c : a 是说:如果x[b] < x[c]为真就返回b,否则就返回x[a] < x[c] ? c : a的返回值
------解决方案--------------------
return (x[a] < x[b] ? (x[b] < x[c] ? b : x[a] < x[c] ? c : a) : (x[b] > x[c] ? b : x[a] > x[c] ? c : a));

1.x[a] < x[b]时,执行x[b] < x[c]
x[b] < x[c]时,返回b;
x[b] > x[c]时,执行x[a] < x[c]
x[a] < x[c]时,返回c
x[a] > x[c]时,返回a
2.x[a] > x[b]时,执行x[b] > x[c]
。。。类似 1.

其实就是3个数的两两比较,只不过用 ? : 写在一起了,写开来就相当于一串 if else

这个算法的判断次数已经最少了,不能再少了
------解决方案--------------------
其实就if...else....的另一种写法而已
------解决方案--------------------
它用的三目运算符
首先是x[a] < x[b]吗?如果成立那么执行:x[b] < x[c] ? b : x[a] < x[c] ? c : a。这个又有三目运算符。x[b] < x[c]吗?如果小于值返回b 如果x[b] > x[c]那么又执行判断 x[a] < x[c]。

这样就是:如果x[a] < x[b] 且x[b] < x[c] 那么就得到中间的b了。
如果x[a] < x[b] 且x[b] > x[c] 那么又判断a,c的关系,如果x[a] < x[c]成立那么就是
x[a] < x[b],x[a] < x[c],x[c] < x[b] ----> x[a] < x[c]<x[b] 这样就得到c
呵呵 其他的就这样推!