2017-03-27 14 views
1

私はJava Shildt The Completeのリファレンスを読んでいますが、コードの一部が非常にシンプルに見えますが、どのように動作するのか理解できません。MinMaxリターンメカニックス。このShildtのコード例はどのように機能しますか?

// 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 

私はこの1つ、その出力理解することができない:出力条件に応じた場合、8なぜ、 ヴァルスを

// 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; 
} 

を[1] .compareTo(ヴァルス[0]> 0は既に真である)(6> 3)、

ので、V = 6、8ない

ここで最大値と最小値がどのように求められるのか理解できません。

説明できますか?ありがとう!

+0

ループがあります。成功しただけでは止まらず、代わりに 'val'を置き換え、' vals'に含まれるすべての項目をチェックします。 –

+0

はい、しかし、条件を真にしている項目で作業条件を見つけることができます。最大値ではありません –

+0

このアルゴリズムでは、 'v'は常に「最大まで」です。あなたの場合。それは8になるまで6になります。それが起こると、 'v 'は8になり、' v.compareTo(vals [i])> 0'チェックで十分なアイテムが他にないので変更されません。 –

答えて

1

i=1vals[1].compareTo(vals[0])と比較された場合は、v=6となります。与えられたfor-loopに対してケースi=3を考えてみましょう。ここでvals[3]8であり、値はv(以前は更新されていたので6)です。 8が6より大きいので、vの値はこの繰り返しで8に更新されます。

+0

ええ、それはいいようですが、" v "は常に" vals [0] "と同じではありませんか? 最後の最大値によって変化しますか? –

+0

No. forループ反復中にiが3のとき、実行中にvがvals [3]に変わります。だから、必ずしも 'vals [0]'と同じではありません。したがって、 'vals [i] .compareTo(v)'の条件が実際に '0'より大きい場合(' v = 6'と 'v = 8'のときは2回発生する)毎回変化する –

+0

ありがとう多く、それは今明らかです! –

0

vは、最大値を保持し、最初の値から始まります。 ループは残りの要素を反復処理し、vals[i].compareTo(v) > 0(つまりvals[i]vより大きい場合)の値をvに設定します。

したがって、最初の2つの要素だけが比較されるわけではありません。 this referenceによれば

0

a.compareTo(b) 

があれば正の値を返し、abより厳密に大きいとみなされるべきである場合にのみ、

// 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]が最大の候補よりも大きいことを意味します。その結果、はvals[i]に割り当てられます。vals[i]は最大の新しい候補です。

+0

ああ、ありがとう、今はっきりしている、私は "vals [i]"だけがループで変化し、 vals [0] " –

関連する問題