查找大小,即Java中存储在数组中的非空元素的数量

时间:2018-09-06 05:42:38

标签: java arrays

目的: Array.length为我们提供了初始化为数组的存储。但是想从初始化的总存储中找出存储在数组中的非空元素的数量。我知道很多方法都是可行的,但是这里的问题与我使用的方法有关。

由于ArrayList有一个size()方法,该方法可为我们提供存储的实际元素数,而与初始化的总存储量无关。

因此,我想到了将数组转换为ArrayList并找出大小的方法。因此,我使用了Arrays.asList(a).size(),如下所示:

public class Driver {

    public static void main(String []args)
    {
        int a[] = new int[10];
        a[0]=30;
        a[1]=100;
        a[2]=33;
        System.out.println((Arrays.asList(a)).size() );
    }

奇怪的是,无论a[0]a[1]a[2]为何,它都将结果返回为1。

如果使用ArrayList而不是Array,则执行相同的步骤将得到结果3:

{
    List<Integer> temp = new ArrayList<Integer>(20); 
    System.out.println(temp.size()); 
    temp.add(20); 
    temp.add(40); 
    System.out.println(temp.size()); 
}

结果是0 2

问题:应该同意asList实用性的Arrays API出了什么问题吗,例如错误或限制?

备注: 通过内部实现,我知道asList会调用ArrayList的构造函数:

  public ArrayList(Collection<? extends E> c) {
        elementData = c.toArray();
        size = elementData.length;
        .....
  }

它再次调用集合的toArray。但是,由于elementData.length应该存储在大小值10中,因此不确定为什么我们得到的答案是1吗?

4 个答案:

答案 0 :(得分:2)

您得到1是因为org_data = ruamel.yaml.comments.CommentedMap() org_data['description'] = 'pqr' org_data['name'] = 'def' 返回Arrays.asList(int[] a),而不是List<int[]>。 您使用方法List<Integer>的方式不正确。如果您想获取asList(),则应将数组的内容一一传递给方法List<Integer>
asList()
没有直接的方法可以快速将数组转换为List<Integer> list = Array.asList(30, 100, 33);

答案 1 :(得分:2)

您试图以某种方式将这三个概念等同起来。

首先,列表或数组中有null个元素。 null是两者中的一个完全有效的值。它与未初始化不同。实际上,默认情况下,任何非基本类型的数组都被显式初始化为null

然后,列表中有未使用的元素。

ArrayList<Integer> a = new ArrayList<>(20);
a.add(null);

您将拥有一个大小为List的{​​{1}}。null是粘贴在列表中的完全有效的引用,容量与大小无关。传递给构造函数的20个提示只是在将20个实际元素插入列表之前不要重新分配内存。其他19个元素不是null。它们实际上不存在。

第三,存在原始数组的问题。创建基本数组时,它将具有固定长度,并且每个元素都包含一个有效值。默认情况下,使用false00L0.0f0.0或适用于该类型的任何东西对数组进行清零。您的代码将创建一个包含三个非零元素和七个零的数组。基元不是引用,因此绝对不能为null。即使可以,从10个元素的数组中制作一个List的大小也会为10。

您尝试创建ArrayList绝不等于应用Arrays.asList(),即使这样做是可行的。创建一个列表并向其中添加三个元素将生成一个大小为3的列表。最重要的是,请记住,List只能 保存引用,对于您的情况,它们是对框式Integer的引用。 Integer引用可以是null,并且仍然是有效的列表项,但不能将其拆箱成原始值。

最后,您无法使用asList将基元数组转换为列表。 asList接受varargs而不是单个列表,这就是为什么您总是以一个元素列表结尾的原因。这里的问题实际上是您有一个基元列表:引用数组将被很好地扩展。 Java 8中的替代方法是

List<Integer> list = Arrays.stream(ints).boxed().collect(Collectors.toList());

注意显式装箱操作。您列表的大小仍然是10,而不是3。

参考:How to convert int[] into List<Integer> in Java?

答案 2 :(得分:0)

没有直接方法可以从List获取Array ... !!!
是,以上句子部分正确。
如果您的数组是原始类型的数组,它将创建一个包含整个数组的列表,作为新创建的列表的第一个元素。

赞:

public static void main(String[] args) {
    int a[] = new int[10];
    a[0] = 30;
    a[1] = 100;
    a[2] = 33;
    List list = Arrays.asList(a);
}

List if int Array

但是,如果您的数组是任何引用类型,那么它将使用传递的数组的每个元素作为列表元素来创建。

public static void main(String[] args) {
    Object a[] = new Object[10];
    a[0] = 30;
    a[1] = 100;
    a[2] = 33;
    List list = Arrays.asList(a);
}

List Of Objects

这就是为什么在您的情况下,它只显示一个元素。

此行为是由于实现了asList(),该实现直接调用ArrayList构造函数。

public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}

答案 3 :(得分:0)

public class Test {

    public static void main(String []args)
    {
        Integer a[] = new Integer[10];
        a[0]=30;
        a[1]=100;
        a[2]=33;
        //List<Integer> list=Arrays.asList(a);
        System.out.println(Arrays.asList(a).size() );
    }
}

输出

  

10

使用包装器类,这是您的解决方案。流到目前为止并没有达到您期望的效果。