【问题标题】:MinMax return mechanics. How does it work on this Shildt's code example?MinMax 返回机制。它在这个 Shildt 的代码示例中是如何工作的?
【发布时间】:2017-03-27 14:11:16
【问题描述】:

我正在阅读 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) > 0 已经为真,

所以 v = 6,而不是 8。

我不明白它如何在这里找到最大值和最小值..

你能解释一下吗?谢谢!

【问题讨论】:

  • 因为那里有一个循环。它不会在一次成功后停止 - 它会替换 val,并检查 vals 中包含的每个项目。
  • 是的,但是..它可以找到一个使条件为真的项目的工作条件,它不能是最大值
  • 在此算法中,v 始终是“迄今为止的最大值”。对于你的情况。在遇到 8 之前,它将是 6。发生这种情况时,v 变为 8 并且之后不会更改,因为没有其他项目可以满足 v.compareTo(vals[i]) &gt; 0 检查。
  • 非常感谢,现在我明白了。问题是我认为'v'总是等于'vals [0]'

标签: java if-statement for-loop


【解决方案1】:

仅适用于完成i=1vals[1].compareTo(vals[0]) 比较的迭代,在这种情况下为v=6。考虑给定 for 循环的情况 i=3。这里vals[3],即8,与v的值(即6,因为之前更新过)进行比较。由于 8 大于 6,所以 v 的值在本次迭代中更新为 8。

【讨论】:

  • 是的,这听起来不错,但是,“v”不是总是等于“vals[0]”吗?还是根据最后一个最大值变化?
  • 没有。在执行期间,v 在 for 循环迭代期间当 i=3 时更改为 vals[3]。所以它并不总是等于vals[0]。因此,它会根据条件 vals[i].compareTo(v) 实际上大于 0 的时间而变化(发生两次,一次在 v=6v=8 时)
【解决方案2】:

v 保存最大值并从第一个开始。 如果vals[i].compareTo(v) &gt; 0(这意味着vals[i] 大于v),则循环遍历剩余元素并将值设置为v

所以不仅比较前两个元素。

【讨论】:

    【解决方案3】:

    根据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] 是最大值的新候选。

    【讨论】:

    • 哦,谢谢,现在很清楚了,我认为只有“vals[i]”在循环中发生变化,“v”总是等于“vals[0]”
    猜你喜欢
    • 2017-01-29
    • 2015-12-21
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多