課程:數組

Array類提供了一種方法,這種方法允許你動態創建和訪問數組。這一節課你將要學到如何使用這些方法。

指定數組

這一節向您展示如何處理當對象是一個數組的時候。

如果你不確定一個特定的對象是一個數組,你可以通過Class.isArray方法麳檢查以下。嚷我們麳看一個例子。

這個示例程序打印數組的名字,這個數組被封裝成一個對象。這個程序執行以下幾步:

1.  它返回Class對象。

2.  獲得Field對象。

3.  對每一個Field對象,程序獲得相應的Class對象通過調用getType方法。

4.  驗證前面步驟返回的Class對象是數組,這個程序調用isArray方法。

以下是源代碼:

import java.lang.reflect.*;
import java.awt.*;
 
class SampleArray {
 
   public static void main(String[] args) {
      KeyPad target = new KeyPad();
      printArrayNames(target);
   }
 
   static void printArrayNames(Object target) {
      Class targetClass = target.getClass();
      Field[] publicFields = targetClass.getFields();
      for (int i = 0; i < publicFields.length; i++) {
         String fieldName = publicFields[i].getName();
         Class typeClass = publicFields[i].getType();
         String fieldType = typeClass.getName();
         if (typeClass.isArray()) {
            System.out.println("Name: " + fieldName + 
               ", Type: " + fieldType);
         }
      }
   }
}
 
class KeyPad {
 
   public boolean alive;
   public Button power;
   public Button[] letters; 
   public int[] codes;
   public TextField[] rows;
   public boolean[] states;
}

輸出如下:

Name: letters, Type: [Ljava.awt.Button;
Name: codes, Type: [I
Name: rows, Type: [Ljava.awt.TextField;
Name: states, Type: [Z

返回組件類型

如果你想發現數組的類型,你將要從這一節的示例中學到。

組件類型是數組元素的類型。例如,arrowKeys數組的組件類型在以下代碼中是Button類型:

Button[] arrowKeys = new Button[4];

通過調用getComponentType方法返回數組元素的組件類型。

示例程序調用getComponentType方法幷且打印出數組中每一個元素的類名。

import java.lang.reflect.*;
import java.awt.*;
 
class SampleComponent {
 
   public static void main(String[] args) {
      int[] ints = new int[2];
      Button[]  buttons = new Button[6];
      String[][] twoDim = new String[4][5];
 
      printComponentType(ints);
      printComponentType(buttons);
      printComponentType(twoDim);
   }
 
   static void printComponentType(Object array) {
      Class arrayClass = array.getClass();
      String arrayName = arrayClass.getName();
      Class componentClass = arrayClass.getComponentType();
      String componentName = componentClass.getName();
      System.out.println("Array: " + arrayName + 
         ", Component: " + componentName);
   }
}

輸出:

Array: [I, Component: int
Array: [Ljava.awt.Button;, Component: java.awt.Button
Array: [[Ljava.lang.String;, Component: [Ljava.lang.String;

創建數組

這一節將要向您展示在運行時創建數組是多麽的簡單。

如果你正在編寫一個例如應用程序構建器的開發工具,你可能想要允許用戶在運行時創建數組。你的程序可以通過Array.newInstance方法提供這個特性。

以下示例程序使用newInstance方法麳創建一個數組的拷貝,這個數組大小是原來數組的兩倍。newInstance方法接受新數組的長度和組件類型。以下是源代碼:

import java.lang.reflect.*;
 
class SampleCreateArray {
 
   public static void main(String[] args) {
      int[] originalArray =  {55, 66};
      int[] biggerArray = (int[]) doubleArray(originalArray);
      System.out.println("originalArray:");
      for (int k = 0; k < Array.getLength(originalArray); k++)
         System.out.println(originalArray[k]);
      System.out.println("biggerArray:");
      for (int k = 0; k < Array.getLength(biggerArray); k++)
         System.out.println(biggerArray[k]);
   }
 
   static Object doubleArray(Object source) {
      int sourceLength = Array.getLength(source);
      Class arrayClass = source.getClass();
      Class componentClass = arrayClass.getComponentType();
      Object result = Array.newInstance(componentClass,
                                        sourceLength * 2);     
      System.arraycopy(source, 0, result, 0, sourceLength);
      return result;
   }
}

輸出:

originalArray:
55
66
biggerArray:
55
66
0
0

你也可以使用newInstance方法麳創建多維數組。在這個情况下,方法的參數是新數組維數的組件類型和int類型的數組。

以下程序展示如何使用newInstance麳創建多維數組:

import java.lang.reflect.*;
 
class SampleMultiArray {
 
   public static void main(String[] args) {
 
      // The oneDimA and oneDimB objects are one 
      // dimensional int arrays with 5 elements.
 
      int[] dim1 = {5};
      int[] oneDimA = (int[]) Array.newInstance(int.class, dim1);
      int[] oneDimB = (int[]) Array.newInstance(int.class, 5);
 
      // The twoDimStr object is a 5 X 10 array of String objects.
 
      int[] dimStr = {5, 10};
      String[][] twoDimStr = 
                 (String[][]) Array.newInstance(String.class,dimStr);
 
      // The twoDimA object is an array of 12 int arrays. The tail
      // dimension is not defined. It is equivalent to the array 
      // created as follows:
      //    int[][] ints = new int[12][];
 
      int[] dimA = {12};
      int[][] twoDimA = (int[][]) Array.newInstance(int[].class, dimA);
   }
}

獲得和設置元素的值

即使你直到運行時才直到數組名字,你也可以檢查或者修改它元素的值。這一節將要告訴你如何來做。

在許多程序中,訪問數組元素你只是通過賦值表達式麳做:

int[10] codes; 
codes[3] = 22; 
aValue = codes[3];

如果你在運行時才直到數組的名稱的時候這種方式是不可行的。

幸運的是,你可以使用Array類的setget方法麳訪問數組元素,當在編譯時刻不知道數組名的時候。除了getset方法,Array類對于原始類型有特定的方法。例如,setInt的參數值是一個intgetBoolean返回的對象是一個boolean類型的包裝類。

示例程序使用setget方法麳拷貝一個數組的內容到另一個數組。

import java.lang.reflect.*;
 
class SampleGetArray {
 
   public static void main(String[] args) {
      int[] sourceInts = {12, 78};
      int[] destInts = new int[2];
      copyArray(sourceInts, destInts);
      String[] sourceStrgs = {"Hello ", "there ", "everybody"};
      String[] destStrgs = new String[3];
      copyArray(sourceStrgs, destStrgs);
   }
 
   public static void copyArray(Object source, Object dest) {
      for (int i = 0; i < Array.getLength(source); i++) {
         Array.set(dest, i, Array.get(source, i));
         System.out.println(Array.get(dest, i));
      }
   }
}

輸出:

12
78
Hello 
there 
everybody
posted on 2007-02-21 00:14  IT Person  阅读(369)  评论(0)    收藏  举报