2011-10-07 67 views
1

我需要端口代碼從黑莓Android和麪對小問題: 例:BB代碼:如何新元素添加到一個數組

public class MyClass{ 
    private MyObject[] _myObject; 

    public void addElement(MyObject o){ 
     if (_myObject == null){ 
     _myObject = new MyObject[0]; 
     } 
     Arrays.add(_myObject, o); 
    } 
} 

不幸機器人不具有Arrays.add()這是部分net.rim.device.api.util.Arraysstatic void add(Object[] array, Object object)

是否有更換爲Android動態擴展和追加到簡單的數組,所以我不會改變我的代碼的其餘部分。

我試着寫我自己的工具,但它不工作:

public class Arrays { 
    public static void add(Object[] array, Object object){ 
    ArrayList<Object> lst = new ArrayList<Object>(); 
    for (Object o : array){ 
     lst.add(o); 
    } 
    lst.add(object); 
    array = lst.toArray(); 
    } 
} 

..之後我打電話

public void addElement(MyObject o){ 
     if (_myObject == null){ 
     _myObject = new MyObject[0]; 
     } 
     Arrays.add(_myObject, o); 
    } 

_myObject仍然含有0元素。

回答

4

是的,因爲_myObject引用是按值傳遞的。你需要使用:

public static Object[] add(Object[] array, Object object){ 
    ArrayList<Object> lst = new ArrayList<Object>(); 
    for (Object o : array){ 
    lst.add(o); 
    } 
    lst.add(object); 
    return lst.toArray(); 
} 

... 

_myObject = Arrays.add(_myObject, o); 

然而,這將是最好只使用一個ArrayList<E>下手......

這裏要明白兩個重要的事情:

的Java 總是使用傳遞值

傳遞的值是引用(獲取對象的方法或null)或基元值。這意味着如果您更改參數的值,則調用者看不到該值。如果更改的參數值是指對象內的東西的價值,這是一個不同的問題:

void doSomething(Person person) { 
    person.setName("New name"); // This will be visible to the caller 
    person = new Person(); // This won't 
} 

數組是固定大小的Java

你不能「加」一個數組的值。一旦你創建它,大小是固定的。如果你想要一個可變大小的集合(這是一個非常普遍的需求),你應該使用List<E>的實現,如ArrayList<E>

+0

感謝您快速回答。請看看這個規範:http://www.blackberry.com/developers/docs/3.7api/net/rim/device/api/util/Arrays.html有void add(Object [] array,Object目的);輪圈開發者如何實現它對他們有用?我的意思是他們只是調用add(object_array,new_element);並用新元素擴展object_array? – kompotFX

+0

@ kompotFX:他們沒有。完全不清楚那個記錄不好的方法是幹什麼的,但我可以向你保證,如果你打印出'array.length',然後調用'add(array,「hello」)',然後再次打印'array.length',它會有相同的價值。它有可能會在數組中找到一個具有空值的元素,並將該元素的值設置爲傳入的元素的值。儘管如此,這與添加*不同。 –

+0

這很奇怪,因爲實際上我需要移植到黑莓手機上的代碼樣本。 – kompotFX

1

這裏是ObjectArrays.concat(object, array)代碼:

public static <T> T[] concat(@Nullable T element, T[] array) { 
    T[] result = newArray(array, array.length + 1); 
    result[0] = element; 
    System.arraycopy(array, 0, result, 1, array.length); 
    return result; 
    } 

的Apache的公共代碼有點長。

相關問題