2016-04-21 17 views
16

我的代碼是是否可以區分存儲在同一整數數組中的字符和整數?

int array[] = {'a',98}; 
for(int num:array) { 
    System.out.println(num); 
} 

如果我打印這一點,我會得到O/P爲。

如果我打印(char) num那麼o/p將是a b

是否可以打印陣列爲a 98?我的猜測是,數組將存儲數組元素的整數值,這是不可能的。但是這裏有什麼解決方案

+4

我想不出有辦法做到這一點。 你想這麼做的原因是什麼?也許你應該使用不同的方法? –

+0

我懷疑這是可能的。你可以用'List'代替嗎? – sidgate

+13

一旦這些值在數組中,它們就是普通整數。無法知道它們來自一個字符還是一個常規整數。 – Berger

回答

27

我不認爲有什麼辦法可以用int[]來做到這一點。但是您可以創建Object[]來實現此目的。

這裏是代碼片段:

public static void main (String[] args) throws Exception { 
    Object array[] = {'a',98}; 
    for(Object o : array){ 
     System.out.println(o); 
    } 
} 

輸出:

a 
98 
+9

如果只有兩種可能的類型(char和int),我寧願創建一個自定義對象來保持該值並確保它是int或char。這樣可以避免危險的行爲,因爲Object數組可以填充任何東西。 –

9
Object[] array = { 'a', 98 } 
if (array[i] instanceof Character) { // Or Integer 
+1

如果使用對象數組,他不必檢查該類,因爲該對象的toString方法是自動調用的。 (在他的打印示例中) –

+0

爲什麼if語句?只需使用'array [i] .toString()'獲得一個不可知的字符串表示。 – MichaelK

+2

@MichaelKarnerfors你甚至不需要調用toString(),因爲它被自動調用! –

10

不,這是不可能的int[]知道,如果它的數據被寫入一個字符或在源代碼中的號碼。如果你想保留這種信息,你需要一個不同的數據結構。

11

你有int[] array,這就是字節碼的樣子:

public class Test { 
    public Test(); 
    Code: 
     0: aload_0 
     1: invokespecial #1 // Method java/lang/Object."<init>":()V 
     4: return 

    public static void main(java.lang.String[]); 
    Code: 
     0: iconst_2 
     1: newarray  int 
     3: dup 
     4: iconst_0 
     5: bipush  97 
     7: iastore 
     8: dup 
     9: iconst_1 
     10: bipush  98 
     12: iastore 
     13: astore_1 
     14: return 
} 

正如你所看到的,值插入爲int

其他用戶建議使用Object[] array。看看它的字節碼:

public class Test { 
    public Test(); 
    Code: 
     0: aload_0 
     1: invokespecial #1  // Method java/lang/Object."<init>":()V 
     4: return 

    public static void main(java.lang.String[]); 
    Code: 
     0: iconst_2 
     1: anewarray  #2  // class java/lang/Object 
     4: dup 
     5: iconst_0 
     6: bipush  97 
     8: invokestatic #3  // Method java/lang/Character.valueOf:(C)Ljava/lang/Character; 
     11: aastore 
     12: dup 
     13: iconst_1 
     14: bipush  98 
     16: invokestatic #4  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 
     19: aastore 
     20: astore_1 
     21: return 
} 

注意

// Method java/lang/Character.valueOf:(C)Ljava/lang/Character; 

線,它告訴該方法Character.valueOf被調用,所以你會得到實際的字符,而不是它的int價值。

+0

很深的解釋。這意味着將調用相應的valueOf()方法將其打印到Object數組,這對於基元數據類型的數組不會發生。是嗎? – Audumbar

+0

@Audumbar是.. – Maroun

相關問題