如何计算arraylist中特定类的实例数?

dan*_*y74 6 java java-7

我有一个数组列表,看起来像:

[new Class1(), new Class2(), new Class1(), new Class1()]
Run Code Online (Sandbox Code Playgroud)

我想知道在数组列表中提取Class1实例数的最有效方法.

对于上面的例子,我想要答案3.

我使用的是Java版"1.7.0_79".

Log*_*gan 7

您可以遍历ArrayList并使用instanceof运算符进行检查.

for (Object e : lst)
{
  if (e instanceof Car)
  {
    carCount++;
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 确实没有更有效的方法,除非您在创建列表时保持运行计数.顺便说一句,对于扩展`Car`的类的对象,`instanceof`将是`true`,以及`car`本身.如果那不是你想要的,那就把它变成`if(e.getClass()== Car.class)`. (4认同)
  • @danday74:保持理货可能只是不必要的复杂化(阅读:错误来源,维护成本增加).你的名单有多大?计算东西需要多长时间? (2认同)
  • `Collections.frequency`并不比你或我写的更有效率.http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collections.java#Collections.frequency%28java.util.Collection%2Cjava.lang.目标29% (2认同)

Rag*_*aju 2

如果数组列表如下所示,

newClass1 = new Class1();

[newClass1, new Class2(), newClass1, newClass1]
Run Code Online (Sandbox Code Playgroud)

然后你可以检查频率,如下所示,

Collections.frequency(arrayList, newClass1);
Run Code Online (Sandbox Code Playgroud)

如果您总是添加 Class1 的新实例,那么下面将是解决方案

[new Class1(), new Class2(), new Class1(), new Class1()]
Run Code Online (Sandbox Code Playgroud)

重写 Class1 中的 equals 方法,如下所示,

 @Override
public boolean equals(Object o){

    if(!(o instanceof Class1 )){
        return false;
    }else{

            return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的测试课中,

System.out.println(Collections.frequency(array, new Class1()));
Run Code Online (Sandbox Code Playgroud)