<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-144  評(píng)論-80  文章-1  trackbacks-0
    操縱java數(shù)組
    如果你做過很多java程序,你可能對(duì)java集合類很熟悉,例如Vector和ArrayList。你可以創(chuàng)建一個(gè)集合并向其中增加元素:

       List lst = new ArrayList();

       lst.add(new Integer(37));

    在這個(gè)特殊的范例中,一個(gè)整型值37用于構(gòu)造一個(gè)Integer封裝類對(duì)象,然后那個(gè)對(duì)象被加入到列表。

    這個(gè)簡(jiǎn)單的范例展示集合的一個(gè)基礎(chǔ)-他們用于操縱一列對(duì)象,其中的每個(gè)對(duì)象是一個(gè)類或者接口類型。因此,一個(gè)ArrayList可以包含Object,String,Float以及Runnable類型的對(duì)象。集合類不能用于原始數(shù)據(jù)類型的列表,例如整型數(shù)組。

    如果你在你的程序中使用原始類型的數(shù)組,你如何操縱它們呢?這個(gè)技巧就給你展示幾個(gè)你可以使用的技術(shù)。

    第一個(gè)技術(shù)是排序。java.util.Arrays類包含一套排序和查找數(shù)組的類方法,例如:

       import java.util.Arrays;

       public class ArrayDemo1 {
           public static void main(String args[]) {
               int vec[] = {37, 47, 23, -5, 19, 56};
               Arrays.sort(vec);
               for (int i = 0; i < vec.length; i++) {
                   System.out.println(vec[i]);
               }
           }
       }

    這個(gè)演示程序初始化一個(gè)整數(shù)數(shù)組然后調(diào)用Arrays.sort升序排序那個(gè)數(shù)組。

    類似的,你可以在排完序的數(shù)組上進(jìn)行二分法查找:

       import java.util.Arrays;

       public class ArrayDemo2 {
           public static void main(String args[]) {
               int vec[] = {-5, 19, 23, 37, 47, 56};
               int slot = Arrays.binarySearch(vec, 35);
               slot = -(slot + 1);
               System.out.println("insertion point = " + slot);
           }
       }

    這個(gè)程序有個(gè)微妙的概念,如果二分法查找失敗它將返回:

    -(insertion point) - 1

    這個(gè)演示程序以參數(shù)35調(diào)用查找方法,而那個(gè)參數(shù)在數(shù)組中不存在,方法返回值-4,如果這個(gè)值加一再取其負(fù)數(shù)就得到3,這就是35應(yīng)該被插入到數(shù)組中的位置,換言之,值-5, 19和23在數(shù)組中占據(jù)的位置是0,1和2。因此值35應(yīng)該在索引3的位置,而37, 47以及56順延。搜索方法并不進(jìn)行實(shí)際的插入操作而只是指出應(yīng)該在何處插入。

    除了排序和查找,我們還可以對(duì)原始類型數(shù)組做什么?另一個(gè)有用的技術(shù)是將一個(gè)原始數(shù)組轉(zhuǎn)換為等價(jià)的對(duì)象類型數(shù)組。每個(gè)對(duì)應(yīng)元素使用它們的封裝器類,例如在封裝數(shù)組中,37成為Integer(37)。

       import java.util.Arrays;
       import java.lang.reflect.Array;
       
       public class ArrayDemo3 {
       
           // if input is a single-dimension primitive array,

           // return a new array consisting of wrapped elements,
           // else just return input argument
       
           public static Object toArray(Object vec) {
       
               // if null, return

       
               if (vec == null) {
                   return vec;
               }
       
               // if not an array or elements not primitive, return

       
               Class cls = vec.getClass();
               if (!cls.isArray()) {
                   return vec;
               }
               if (!cls.getComponentType().isPrimitive()) {
                   return vec;
               }
       
               // get array length and create Object output array

       
               int length = Array.getLength(vec);
               Object newvec[] = new Object[length];
       
               // wrap and copy elements

       
               for (int i = 0; i < length; i++) {
                   newvec[i] = Array.get(vec, i);
               }
       
               return newvec;
           }
       
           public static void main(String args[]) {
       
               // create a primitive array

       
               int vec[] = new int[]{1, 2, 3};
       
               // wrap it

       
               Object wrappedvec[] = (Object[])toArray(vec);
       
               // display result

       
               for (int i = 0; i < wrappedvec.length; i++) {
                   System.out.println(wrappedvec[i]);
               }
           }
       }

    方法"toArray"的參數(shù)是一個(gè)Object對(duì)象(數(shù)組可以被賦值給一個(gè)Object引用)。如果參數(shù)是null或者代表的不是原始類型數(shù)組那么這個(gè)方法簡(jiǎn)單的返回參數(shù)值。java.lang.Class工具類用于判斷參數(shù)是否是一個(gè)數(shù)組并獲取數(shù)組的底層元素的類型。

    一旦做完這些檢查,使用java.lang.reflect.Array工具類的反射工具方法就可以獲取原始數(shù)組的長度并獲得數(shù)組的單個(gè)元素。Array.get獲得的每個(gè)元素被返回到封裝器類中,例如Integer或者Double。

    最終的范例基于前面的那個(gè)并向你展示如何在數(shù)組上使用集合特性。這假設(shè)你已經(jīng)有一個(gè)對(duì)象數(shù)組。

       import java.util.Arrays;
       import java.util.List;

       public class ArrayDemo4 {
           public static void main(String args[]) {
               Object vec[] = {new Integer(37), new Integer(47)};
               List lst = Arrays.asList(vec);
               lst.set(1, new Integer(57));
               for (int i = 0; i < vec.length; i++) {
                   System.out.println(vec[i]);
               }
           }
       }


    在這個(gè)程序中,vec是一個(gè)對(duì)象數(shù)組,包含Integer(37)和Integer(47),然后Arrays.asList被調(diào)用。它返回一個(gè)集合(List接口類型),使用數(shù)組作為集合的后臺(tái)存儲(chǔ)。換言之,ArrayList這樣的集合類型在它內(nèi)部有某種存儲(chǔ)類型去存儲(chǔ)集合元素。在這個(gè)例子中,使用的存儲(chǔ)類型是作為參數(shù)傳遞到Arrays.asList的數(shù)組。這意味著集合方法所做的改變會(huì)被反射到底層的數(shù)組。

    修改集合中的元素1導(dǎo)致底層的數(shù)組也改變,程序的輸出是:

    37
    57

    因此如果你有一個(gè)對(duì)象數(shù)組,你可以在它上面使用集合特性,數(shù)組自身作為底層存儲(chǔ)。

    我們也可以將集合轉(zhuǎn)換為一個(gè)對(duì)象數(shù)組,例如:

    Object vec[] = lst.toArray();

    摘自:http://www.javaresearch.org/article/showarticle.jsp?column=1&thread=2994

    posted on 2005-03-21 17:07 小力力力 閱讀(619) 評(píng)論(0)  編輯  收藏 所屬分類: LINUX
    主站蜘蛛池模板: 香港特级三A毛片免费观看| 天天爽亚洲中文字幕| 夜夜爽妓女8888视频免费观看 | 午夜免费国产体验区免费的| 大地资源在线观看免费高清| 亚洲成a人片在线观看中文app| 十九岁在线观看免费完整版电影| 久久久久久亚洲精品| 久久爰www免费人成| 亚洲图片一区二区| 精品福利一区二区三区免费视频 | 好爽又高潮了毛片免费下载| ww亚洲ww在线观看国产| 亚洲成在人线aⅴ免费毛片| 涩涩色中文综合亚洲| 国产精品冒白浆免费视频| 人妻仑刮八A级毛片免费看| 最新亚洲成av人免费看| 日本卡1卡2卡三卡免费| 亚洲国产精品久久久久秋霞影院| 波多野结衣免费在线观看| 亚洲精品一二三区| 国产成人aaa在线视频免费观看| 免费在线人人电影网| 亚洲国产精品国自产拍AV| 在线免费观看亚洲| 亚洲精品av无码喷奶水糖心| 亚洲日韩涩涩成人午夜私人影院| 99久久国产精品免费一区二区| 911精品国产亚洲日本美国韩国| 在线观看日本免费a∨视频| 极品色天使在线婷婷天堂亚洲| 国产亚洲一区二区三区在线不卡| 久9这里精品免费视频| 在线观看亚洲AV日韩AV| 亚洲乱码中文字幕手机在线| 久久国产乱子伦精品免费不卡| 亚洲国产片在线观看| 亚洲国产成人爱av在线播放 | 99爱在线精品视频免费观看9| 2020国产精品亚洲综合网|