今天看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));
}
感觉这个方法很好,但是我比较笨,谁能帮我解释下这个方法的逻辑是什么,还有就是有比这更好的方法返回中间值么?
菜鸟求解
/**
* 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[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这个算法的判断次数已经最少了,不能再少了
首先是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
呵呵 其他的就这样推!