2011-10-07 5 views
1

J'ai besoin au code de port de BlackBerry pour Android et petit problème face: Exemple: le code bb est:Comment ajouter un nouvel élément dans un tableau

public class MyClass{ 
    private MyObject[] _myObject; 

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

malheureusement android ne pas Arrays.add() qui fait partie de

Existe-t-il un remplacement pour android pour étendre dynamiquement et ajouter dans un tableau simple afin que je ne change pas le reste de mon code.

J'ai essayé d'écrire mon propre utilitaire, mais il ne fonctionne pas:

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(); 
    } 
} 

.. après que j'appelle

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

l'_myObject contiennent encore 0 éléments.

Répondre

4

Oui, car la référence _myObject est transmise par valeur. Vous auriez besoin d'utiliser:

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); 

Cependant, il serait préférable d'utiliser juste un ArrayList<E> pour commencer ...

Il y a deux choses importantes à comprendre ici:

Java toujours utilise le passage par la valeur

La valeur qui est transmis est soit une référence (un moyen d'obtenir sur un objet, ou null) ou une primitive valeur. Cela signifie que si vous modifiez la valeur du paramètre , cela ne sera pas visible par l'appelant. Si vous modifiez la valeur de quelque chose dans l'objet la valeur du paramètre se réfère à, qui est une autre affaire:

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

Les tableaux sont de taille fixe en Java

Vous ne pouvez pas « ajouter » une valeur à un tableau. Une fois que vous l'avez créé, la taille est fixe. Si vous voulez une collection de taille variable (qui est une exigence très commune), vous devez utiliser une implémentation de List<E> telle que ArrayList<E>.

+0

merci pour une réponse rapide. S'il vous plaît, jetez un oeil à cette spécification: http://www.blackberry.com/developers/docs/3.7api/net/rim/device/api/util/Arrays.html Il y a void add (Object [] array, Object objet); Comment les développeurs de jantes réalisent-ils que cela fonctionne pour eux?Je veux dire qu'ils appellent simplement add (object_array, new_element); et object_array étendu avec un nouvel élément? – kompotFX

+0

@kompotFX: Ils ne le font pas. On ne sait pas exactement ce que fait cette méthode mal documentée, mais je peux vous garantir que si vous imprimez 'array.length', alors appelez' add (array, "hello") ', puis à nouveau' array.length', Je vais avoir la même valeur. Il est possible qu'il recherche un élément dans le tableau qui a une valeur nulle, et définisse la valeur de cet élément à celle qui a été transmise. Ce n'est pas la même chose que * ajouter * cependant. –

+0

c'est très étrange, car en fait l'exemple de code que j'ai besoin de porter fonctionne sur blackberry. – kompotFX

1

Voici le code de 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; 
    } 

Le code apache-commons est un peu plus.

Questions connexes