2011-09-19 32 views
0
TreeNode[] children = grid[row][col].getChildren(); 

我想一个简单的函数,能告诉我有多少个对象在此数组中? getChildren()将返回大小没有大于4的对象,例如:像array.length函数不包含NULL元素?

children[0] = null; 
children[1] = TreeNode Object 
children[2] = null; 
children[3] = null; 
+0

所以你会想'children.mySizeMethod()'返回4或1(或别的东西,Ë VEN)? –

+0

考虑使用'List'或'Map'代替普通老式阵列。 Collections API提供了许多有用的类和方法。 – BalusC

+0

(@BalusC - 真的......但有没有“有多少非空元素”的方法......假设这就是他的询问。) –

回答

4

你为什么不把它写自己:

public static <T> int getLength(T[] arr){ 
    int count = 0; 
    for(T el : arr) 
     if (el != null) 
      ++count; 
    return count; 
} 
0

这应该工作。基本上与为您编写的函数相同,而不是特定的TreeNode。

int initLength(Object[] myArray) { 
    int count = 0; 
    for (Object obj : myArray) { 
    if (obj != null) count++; 
    } 
    return count; 
} 

我把它称为initLength,因为这些项目是init'd,但称它为你喜欢的。有些人会说,当你定义它的时候,它是init'd,无论内容是否为空。

0

其他替代:

ArrayList l = new ArrayList(Arrays.asList(children)); 
l.removeAll(Collections.singleton(null)); 
l.size(); 
0

或许矫枉过正使用谓词,但这里有一个番石榴解决方案:

int numNotNull = Iterables.size(Iterables.filter(Arrays.asList(children), 
         Predicates.notNull())); 
0

在Java 8中,您可以使用Math.toIntExactArrays.stream构建一个漂亮的单行:

Math.toIntExact(Arrays.stream(row).filter(s -> s != null).count()) 
+0

有谁知道这是不是更好,性能明智的,比自己写一个循环? –

+1

几乎肯定不是。由于数组已经被分配,所以你不会看到使用流的任何性能改进。当这种事情真正的亮点,当你从如文件或套接字的I/O流(或一些其他类型的来源可以阅读懒洋洋的)读的 – mumrah