【问题标题】:How to add new element into an array [duplicate]如何将新元素添加到数组中[重复]
【发布时间】:2011-12-02 23:50:52
【问题描述】:

我需要将代码从黑莓移植到 android 并面临一个小问题: 示例:bb代码为:

public class MyClass{
   private MyObject[] _myObject;

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

不幸的是android没有Arrays.add(),它是net.rim.device.api.util.Arrays的一部分(static 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 个元素。

【问题讨论】:

    标签: java android arrays


    【解决方案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-commons 代码有点长。

    【讨论】:

      【解决方案2】:

      是的,因为_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&lt;E&gt; 开头...

      这里有两件重要的事情需要理解:

      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&lt;E&gt; 的实现,例如ArrayList&lt;E&gt;

      【讨论】:

      • 感谢您的快速回答。请看一下这个规范:blackberry.com/developers/docs/3.7api/net/rim/device/api/util/… There is void add(Object[] array, Object object); rim 开发人员如何实现它对他们有用?我的意思是他们只是调用 add(object_array, new_element);和 object_array 用新元素扩展?
      • @kompotFX:他们没有。完全不清楚那个记录不充分的方法做了什么,但我可以向你保证,如果你打印出array.length,然后调用add(array, "hello"),然后再次打印array.length,它将具有相同的值。它可能会在数组中查找具有 null 值的元素,并将该元素的值设置为传入的值。但这与 adding 不同。跨度>
      • 这很奇怪,因为实际上我需要移植的代码示例适用于黑莓。
      • @kompotFX:那么您在顶部给出的代码将总是_myObject 保留为长度为0 的数组。当然,这是假设 RIM 没有破坏 Java 的工作方式,但我怀疑他们没有。如果你能展示一个简短但完整的程序来展示 RIM 的代码工作,那将很有用。
      • 那么,你想说RIM开发者对此有误:blackberry.com/developers/docs/3.7api/net/rim/device/api/util/…, java.lang.Object)> ?
      猜你喜欢
      • 2014-05-26
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      • 2018-04-14
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2012-08-19
      相关资源
      最近更新 更多