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

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

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

    如果你做過(guò)很多java程序,你可能對(duì)java集合類(lèi)很熟悉,例如Vector和ArrayList。你可以創(chuàng)建一個(gè)集合并向其中增加元素:
    1.     List lst = new ArrayList();
    2.     lst.add(new Integer(37));

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

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

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

    第一個(gè)技術(shù)是排序。java.util.Arrays類(lèi)包含一套排序和查找數(shù)組的類(lèi)方法,例如:
    1.     import java.util.Arrays;
    2.     public class ArrayDemo1 {
    3.         public static void main(String args[]) {
    4.             int vec[] = {37, 47, 23, -5, 19, 56};
    5.             Arrays.sort(vec);
    6.             for (int i = 0; i < vec.length; i++) {
    7.                 System.out.println(vec[i]);
    8.             }
    9.         }
    10.     }

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

    類(lèi)似的,你可以在排完序的數(shù)組上進(jìn)行二分法查找:
    1.     import java.util.Arrays;
    2.     public class ArrayDemo2 {
    3.         public static void main(String args[]) {
    4.             int vec[] = {-5, 19, 23, 37, 47, 56};
    5.             int slot = Arrays.binarySearch(vec, 35);
    6.             slot = -(slot + 1);
    7.             System.out.println("insertion point = " + slot);
    8.         }
    9.     }

    這個(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ì)原始類(lèi)型數(shù)組做什么?另一個(gè)有用的技術(shù)是將一個(gè)原始數(shù)組轉(zhuǎn)換為等價(jià)的對(duì)象類(lèi)型數(shù)組。每個(gè)對(duì)應(yīng)元素使用它們的封裝器類(lèi),例如在封裝數(shù)組中,37成為Integer(37)。
    1.     import java.util.Arrays;
    2.     import java.lang.reflect.Array;
    3.     
    4.     public class ArrayDemo3 {
    5.     
    6.         // if input is a single-dimension primitive array,
    7.         // return a new array consisting of wrapped elements,
    8.         // else just return input argument
    9.     
    10.         public static Object toArray(Object vec) {
    11.     
    12.             // if null, return
    13.     
    14.             if (vec == null) {
    15.                 return vec;
    16.             }
    17.     
    18.             // if not an array or elements not primitive, return
    19.     
    20.             Class cls = vec.getClass();
    21.             if (!cls.isArray()) {
    22.                 return vec;
    23.             }
    24.             if (!cls.getComponentType().isPrimitive()) {
    25.                 return vec;
    26.             }
    27.     
    28.             // get array length and create Object output array
    29.     
    30.             int length = Array.getLength(vec);
    31.             Object newvec[] = new Object[length];
    32.     
    33.             // wrap and copy elements
    34.     
    35.             for (int i = 0; i < length; i++) {
    36.                 newvec[i] = Array.get(vec, i);
    37.             }
    38.     
    39.             return newvec;
    40.         }
    41.     
    42.         public static void main(String args[]) {
    43.     
    44.             // create a primitive array
    45.     
    46.             int vec[] = new int[]{1, 2, 3};
    47.     
    48.             // wrap it
    49.     
    50.             Object wrappedvec[] = (Object[])toArray(vec);
    51.     
    52.             // display result
    53.     
    54.             for (int i = 0; i < wrappedvec.length; i++) {
    55.                 System.out.println(wrappedvec[i]);
    56.             }
    57.         }
    58.     }

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

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

    最終的范例基于前面的那個(gè)并向你展示如何在數(shù)組上使用集合特性。這假設(shè)你已經(jīng)有一個(gè)對(duì)象數(shù)組。
    1.     import java.util.Arrays;
    2.     import java.util.List;
    3.     public class ArrayDemo4 {
    4.         public static void main(String args[]) {
    5.             Object vec[] = {new Integer(37), new Integer(47)};
    6.             List lst = Arrays.asList(vec);
    7.             lst.set(1, new Integer(57));
    8.             for (int i = 0; i < vec.length; i++) {
    9.                 System.out.println(vec[i]);
    10.             }
    11.         }
    12.     }

    在這個(gè)程序中,vec是一個(gè)對(duì)象數(shù)組,包含Integer(37)和Integer(47),然后Arrays.asList被調(diào)用。它返回一個(gè)集合(List接口類(lèi)型),使用數(shù)組作為集合的后臺(tái)存儲(chǔ)。換言之,ArrayList這樣的集合類(lèi)型在它內(nèi)部有某種存儲(chǔ)類(lèi)型去存儲(chǔ)集合元素。在這個(gè)例子中,使用的存儲(chǔ)類(lèi)型是作為參數(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();

    package com.cucu.test;

    /**
    * @author http://www.linewell.com <a href=mailto:cg@linewell.com>cg@linewell.com</a>
    * @version 1.0
    */
    public class Sort {

    public void swap(int a[], int i, int j) {
    int tmp = a;
    a = a[j];
    a[j] = tmp;
    }

    public int partition(int a[], int low, int high) {
    int pivot, p_pos, i;
    p_pos = low;
    pivot = a[p_pos];
    for (i = low + 1; i <= high; i++) {
    if (a > pivot) {
    p_pos++;
    swap(a, p_pos, i);
    }
    }
    swap(a, low, p_pos);
    return p_pos;
    }

    public void quicksort(int a[], int low, int high) {
    int pivot;
    if (low < high) {
    pivot = partition(a, low, high);
    quicksort(a, low, pivot - 1);
    quicksort(a, pivot + 1, high);
    }

    }

    public static void main(String args[]) {
    int vec[] = new int[] { 37, 47, 23, -5, 19, 56 };
    int temp;
    //選擇排序法(Selection Sort)
    long begin = System.currentTimeMillis();
    for (int k = 0; k < 1000000; k++) {
    for (int i = 0; i < vec.length; i++) {
    for (int j = i; j < vec.length; j++) {
    if (vec[j] > vec) {
    temp = vec;
    vec = vec[j];
    vec[j] = temp;
    }
    }

    }
    }
    long end = System.currentTimeMillis();
    System.out.println("選擇法用時(shí)為:" + (end - begin));
    //打印排序好的結(jié)果
    for (int i = 0; i < vec.length; i++) {
    System.out.println(vec);
    }
    // 冒泡排序法(Bubble Sort)
    begin = System.currentTimeMillis();
    for (int k = 0; k < 1000000; k++) {
    for (int i = 0; i < vec.length; i++) {
    for (int j = i; j < vec.length - 1; j++) {
    if (vec[j + 1] > vec[j]) {
    temp = vec[j + 1];
    vec[j + 1] = vec[j];
    vec[j] = temp;
    }
    }

    }
    }
    end = System.currentTimeMillis();
    System.out.println("冒泡法用時(shí)為:" + (end - begin));
    //打印排序好的結(jié)果
    for (int i = 0; i < vec.length; i++) {
    System.out.println(vec);
    }

    //插入排序法(Insertion Sort)
    begin = System.currentTimeMillis();
    for (int k = 0; k < 1000000; k++) {
    for (int i = 1; i < vec.length; i++) {
    int j = i;
    while (vec[j - 1] < vec) {
    vec[j] = vec[j - 1];
    j--;
    if (j <= 0) {
    break;
    }
    }
    vec[j] = vec;
    }
    }
    end = System.currentTimeMillis();
    System.out.println("插入法用時(shí)為:" + (end - begin));
    //打印排序好的結(jié)果
    for (int i = 0; i < vec.length; i++) {
    System.out.println(vec);
    }

    //快速排序法(Quick Sort)

    Sort s = new Sort();
    begin = System.currentTimeMillis();
    for (int k = 0; k < 1000000; k++) {
    s.quicksort(vec, 0, 5);
    }
    end = System.currentTimeMillis();
    System.out.println("快速法用時(shí)為:" + (end - begin));
    //打印排序好的結(jié)果
    for (int i = 0; i < vec.length; i++) {
    System.out.println(vec);
    }
    }

    }
    以下是運(yùn)行結(jié)果:
    選擇法用時(shí)為:234
    56
    47
    37
    23
    19
    -5
    冒泡法用時(shí)為:172
    56
    47
    37
    23
    19
    -5
    插入法用時(shí)為:78
    56
    47
    37
    23
    19
    -5
    快速法用時(shí)為:297
    56
    47
    37
    23
    19
    -5*
    posted on 2006-03-06 10:16 rodney 閱讀(384) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 初學(xué)JAVA
     
    主站蜘蛛池模板: 亚洲网站视频在线观看| 日韩在线视频免费| 亚洲国产一区在线| 亚洲日韩一区二区三区| 一区二区在线免费视频| 亚洲免费闲人蜜桃| 亚洲人AV永久一区二区三区久久| 亚洲Av综合色区无码专区桃色 | 亚洲综合久久久久久中文字幕| 成人嫩草影院免费观看| 亚洲精品无码永久在线观看| 一个人免费观看日本www视频| 亚洲va中文字幕无码| 亚洲美女一区二区三区| 5555在线播放免费播放| 亚洲深深色噜噜狠狠爱网站| 亚洲欧洲日产国码久在线| 在线a人片天堂免费观看高清| 亚洲a一级免费视频| 亚欧国产一级在线免费| 精品久久免费视频| 亚洲人成综合在线播放| 一级毛片免费观看不卡的| 亚洲高清最新av网站| 国产免费人成视频尤勿视频| 日韩免费高清视频| 亚洲色欲色欲www| 久久久久久精品免费免费自慰| 亚洲精品电影天堂网| 影音先锋在线免费观看| 色多多A级毛片免费看| 亚洲精品国产字幕久久不卡| 美女黄色免费网站| 国产片免费在线观看| 亚洲国产精品ⅴa在线观看| 毛片a级毛片免费播放100| 亚洲日本在线免费观看| 在线看无码的免费网站| 久久精品亚洲一区二区三区浴池| 大地资源中文在线观看免费版| 久久亚洲2019中文字幕|