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

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

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

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

          第一個技術(shù)是排序。java.util.Arrays類包含一套排序和查找數(shù)組的類方法,例如:
          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.     }

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

          類似的,你可以在排完序的數(shù)組上進行二分法查找:
          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.     }

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

              -(insertion point) - 1

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

          除了排序和查找,我們還可以對原始類型數(shù)組做什么?另一個有用的技術(shù)是將一個原始數(shù)組轉(zhuǎn)換為等價的對象類型數(shù)組。每個對應(yīng)元素使用它們的封裝器類,例如在封裝數(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ù)是一個Object對象(數(shù)組可以被賦值給一個Object引用)。如果參數(shù)是null或者代表的不是原始類型數(shù)組那么這個方法簡單的返回參數(shù)值。java.lang.Class工具類用于判斷參數(shù)是否是一個數(shù)組并獲取數(shù)組的底層元素的類型。

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

          最終的范例基于前面的那個并向你展示如何在數(shù)組上使用集合特性。這假設(shè)你已經(jīng)有一個對象數(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.     }

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

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

              37
              57

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

          我們也可以將集合轉(zhuǎn)換為一個對象數(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("選擇法用時為:" + (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("冒泡法用時為:" + (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("插入法用時為:" + (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("快速法用時為:" + (end - begin));
          //打印排序好的結(jié)果
          for (int i = 0; i < vec.length; i++) {
          System.out.println(vec);
          }
          }

          }
          以下是運行結(jié)果:
          選擇法用時為:234
          56
          47
          37
          23
          19
          -5
          冒泡法用時為:172
          56
          47
          37
          23
          19
          -5
          插入法用時為:78
          56
          47
          37
          23
          19
          -5
          快速法用時為:297
          56
          47
          37
          23
          19
          -5*
          posted on 2006-03-06 10:16 rodney 閱讀(380) 評論(0)  編輯  收藏 所屬分類: 初學JAVA
           
          主站蜘蛛池模板: 怀远县| 来凤县| 万宁市| 黑山县| 扬中市| 白沙| 龙江县| 禹州市| 澎湖县| 伊金霍洛旗| 建平县| 连江县| 孟州市| 福海县| 台中市| 高雄市| 新津县| 武鸣县| 滨州市| 澄迈县| 阜阳市| 铁岭市| 康马县| 兰考县| 彰化县| 石棉县| 荥阳市| 且末县| 南部县| 锦州市| 永州市| 夏河县| 新干县| 安宁市| 寻甸| 天祝| 稷山县| 葫芦岛市| 西峡县| 淮滨县| 内乡县|