亚洲免费乱码视频,日韩 欧美 国产 动漫 一区,97在线观看免费视频播国产,中文字幕亚洲图片

      1. <legend id="ppnor"></legend>

      2. 
        
        <sup id="ppnor"><input id="ppnor"></input></sup>
        <s id="ppnor"></s>

        Java庫謎題59:什么是差

        字號:

        下面的程序在計算一個int數(shù)組中的元素兩兩之間的差,將這些差置于一個集合中,然后打印該集合的尺寸大小。那么,這個程序?qū)⒋蛴〕鍪裁茨兀?BR>    import java.util.*;
            public class Differences {
             public static void main(String[ ] args) {
             int vals[ ] = { 789, 678, 567, 456, 345, 234, 123, 012 };
             Set diffs = new HashSet();
             for (int i = 0; i < vals.length; i++)
             for (int j = i; j < vals.length; j++)
             diffs.add(vals[i] - vals[j]);
             System.out.println(diffs.size());
             }
            }
            外層循環(huán)迭代數(shù)組中的每一個元素,而內(nèi)層循環(huán)從外層循環(huán)當(dāng)前迭代到的元素開始迭代到數(shù)組中的最后一個元素。因此,這個嵌套的循環(huán)將遍歷數(shù)組中每一種可能的兩兩組合。(元素可以與其自身組成一對。)這個嵌套循環(huán)中的每一次迭代都計算了一對元素之間的差(總是正的),并將這個差存儲到了集合中,集合是可以消除重復(fù)元素的。因此,本謎題就帶來了一個問題,在由vals數(shù)組中的元素結(jié)成的對中,有多少的正的差存在呢?
            當(dāng)你仔細(xì)觀察程序中的數(shù)組時,會發(fā)現(xiàn)其構(gòu)成模式非常明顯:連續(xù)兩個元素之間的差總是111。因此,兩個元素之間的差是它們在數(shù)組之間的偏移量之差的函數(shù)。如果兩個元素是相同的,那么它們的差就是0;如果兩個元素是相鄰的,那么它們的差就是111;如果兩個元素被另一個元素分割開了,那么它們的差就是222;以此類推。看起來不同的差的數(shù)量與元素間不同的距離的數(shù)量是相等的,也就是等于數(shù)組的尺寸,即8。如果你運行該程序,就會發(fā)現(xiàn)它打印的是14。怎么回事呢?
            上面的分析有一個小的漏洞。要想了解清楚這個缺陷,我們可以通過將println語句中的.size()這幾個字符移除掉,來打印出集合中的內(nèi)容。這么做會產(chǎn)生下面的輸出:
            [111,222,446,557,668,113,335,444,779,224,0,333,555,666]
            這些數(shù)字并非都是111的倍數(shù)。在vals數(shù)組中肯定有兩個毗鄰的元素的差是113。如果你觀察該數(shù)組的聲明,不可能很清楚地發(fā)現(xiàn)原因所在:
            int vals[ ] = { 789, 678, 567, 456, 345, 234, 123, 012 };
            但是如果你打印數(shù)組的內(nèi)容,你就會看見下面的內(nèi)容:
            [789,678,567,456,345,234,123,10]
            為什么數(shù)組中的最后一個元素是10而不是12呢?因為以0開頭的整數(shù)類型字面常量將被解釋成為八進(jìn)制數(shù)值[JLS 3.10.1]。這個隱晦的結(jié)構(gòu)是從C編程語言那里遺留下來東西,C語言產(chǎn)生于1970年代,那時八進(jìn)制比現(xiàn)在要通用得多。
            一旦你知道了012 == 10,就會很清楚為什么該程序打印出了14:有6個不涉及最后一個元素的的非0差,有7個涉及最后一個元素的非0差,還有0,加在一起正好是14個的差。訂正該程序的方法更加明顯:將八進(jìn)制整型字面常量012替換為十進(jìn)制整型字面常量12。如果你這么做了,該程序?qū)⒋蛴〕鑫覀兯谕?。
            本謎題的教訓(xùn)很簡單:千萬不要在一個整型字面常量的前面加上一個0;這會使它變成一個八進(jìn)制字面常量。有意識地使用八進(jìn)制整型字面常量的情況相當(dāng)少見,你應(yīng)該對所有的這種特殊用法增加注釋。對語言設(shè)計者來說,在決定應(yīng)該包含什么特性時,應(yīng)該考慮到其限制條件。當(dāng)有所遲疑時,應(yīng)該將它剔除在外。