今天看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));
    }
感觉这个方法很好,但是我比较笨,谁能帮我解释下这个方法的逻辑是什么,还有就是有比这更好的方法返回中间值么?
菜鸟求解

解决方案 »

  1.   

    不是ArrayList里的 是Arrays里的med3 方法
      

  2.   

    先判断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的返回值
      

  3.   

    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这个算法的判断次数已经最少了,不能再少了
      

  4.   

    其实就if...else....的另一种写法而已
      

  5.   

    它用的三目运算符
    首先是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
    呵呵 其他的就这样推!