我正在阅读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。
我无法理解它如何在这里找到最大值和最小值..
你可以解释一下吗?谢谢!答案 0 :(得分:2)
仅适用于进行i=1
,vals[1].compareTo(vals[0])
比较的迭代,在这种情况下v=6
。考虑给定for循环的情况i=3
。此处vals[3]
8
与v
的值进行比较(自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)
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]
是最大候选者。