MinMax返回机制。它如何在这个Shildt的代码示例中起作用?

时间:2017-03-27 14:11:16

标签: java if-statement for-loop

我正在阅读Java Shildt The Complete参考资料,我想知道一段代码看起来非常简单,但我无法理解它是如何工作的。

// A generic interface example.
// A Min/Max interface.
interface MinMax<T extends Comparable<T>> {
T min();
T max();
}

// Now, implement MinMax
class MyClass<T extends Comparable<T>> implements MinMax<T> {
T[] vals;

MyClass(T[] o) {
    vals = o;
}

// Return the minimum value in vals.
public T min() {
    T v = vals[0];
    for (int i = 1; i < vals.length; i++)
        if (vals[i].compareTo(v) < 0) v = vals[i];
    return v;
}

// Return the maximum value in vals.
public T max() {
    T v = vals[0];
    for (int i = 1; i < vals.length; i++)
        if (vals[i].compareTo(v) > 0) v = vals[i];
    return v;
}
}

class GenIFDemo {
public static void main(String args[]) {
    Integer inums[] = {3, 6, 2, 8, 6};
    Character chs[] = {'b', 'r', 'p', 'w'};
    MyClass<Integer> iob = new MyClass<Integer>(inums);
    MyClass<Character> cob = new MyClass<Character>(chs);
    System.out.println("Max value in inums: " + iob.max());
    System.out.println("Min value in inums: " + iob.min());
    System.out.println("Max value in chs: " + cob.max());
    System.out.println("Min value in chs: " + cob.min());
}
}
//The output is shown here:
//Max value in inums: 8
//Min value in inums: 2
//Max value in chs: w
//Min value in chs: b

我无法理解这一点及其输出:

// Return the maximum value in vals.
public T max() {
    T v = vals[0];
    for (int i = 1; i < vals.length; i++)
        if (vals[i].compareTo(v) > 0) v = vals[i];
    return v;
}

为什么输出为8,如果根据条件, vals [1] .compareTo(vals [0]) (6> 3) &gt; 0 已经是真的,

所以v = 6,而不是8。

我无法理解它如何在这里找到最大值和最小值..

你可以解释一下吗?谢谢!

3 个答案:

答案 0 :(得分:2)

仅适用于进行i=1vals[1].compareTo(vals[0])比较的迭代,在这种情况下v=6。考虑给定for循环的情况i=3。此处vals[3] 8v的值进行比较(自6之前更新后)=SUM(OFFSET(INDIRECT(ADDRESS(MAX(IF((($K$2:$K$5="orange")*($L$2:$L$5=2010)),ROW($K$2:$K$5))),MATCH("Mar",$M$1:$X$1,0)+COLUMN($L$1))),0,0,1,(12-(MATCH(2010,$L$2:$L$5,0)+ROW($L$1)))))。由于8大于6,因此在此迭代中v的值更新为8。

答案 1 :(得分:1)

v保持最大值并从第一个开始。 如果v(这意味着vals[i].compareTo(v) > 0大于vals[i]),循环将迭代其余元素并将值设置为v

因此,不仅要比较前两个元素。

答案 2 :(得分:1)

根据this reference

a.compareTo(b)
当且仅当a被视为严格大于b时,

才会返回正值,这意味着

// Return the maximum value in vals.
public T max() {
    T v = vals[0];
    for (int i = 1; i < vals.length; i++)
        if (vals[i].compareTo(v) > 0) v = vals[i];
    return v;
}

实际上确定v是最大候选者的最大值。如果vals[i].compareTo(v)大于零,则表示v[i]大于候选者的最大值。因此,v已分配vals[i],因为vals[i]是最大候选者。