有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java查找ArrayList中的对象是否有特定字段

我试图找出ArrayList中的一个对象是否有一个具有特定值的特定字段。我想这样做,只使用ArrayList,而不是N个单独的对象:

SomeObject o1 = new SomeObject();
SomeObject o2 = new SomeObject();
...
SomeObject oN = new SomeObject();


boolean running = true;
while (running)
{
    //Do stuff
    running = o1.booleanField || o2.booleanField || ... || oN.booleanField;
}

我认为可以用for each循环来实现,但我不确定如何实现。如果我说的有道理,请回答


共 (2) 个答案

  1. # 1 楼答案

    当你说,Object o1 = new Object();你不是在说java.lang.Object,对吗?因为java.lang.Object的字段是在javadoc中定义的,您不能要求某种类型的booleanfield,所以它将不存在

    如果ArrayList包含几种类型的对象,则可以使用instanceof.getClass()来知道该类对象所属

    ArrayList<Object> objs = .... 
    for (Object obj : objs) { 
         if (obj instanceof MyObject1) {
               MyObject1 myObject1 = (MyObject1) obj;
              // check for boolean field using its getter
         }
         else if (obj instanceof MyObject2) { 
               MyObject2 myObject2 = (MyObject2) obj;
              // check for boolean field using its getter
         }  
         ....
    }
    

    如果ArrayList只包含一种对象,请查看@Mena的答案

  2. # 2 楼答案

    假设是单线程场景,您应该:

    • 用对象的类参数化ArrayList的类型,而不是使用Object
    • 不要使用while循环,而是使用for或增强的for循环来迭代ArrayList<YourObject>,当任一元素具有boolean属性的所需值时,通过调用其getter来中断
    • 这并没有针对任何度量进行优化,它只会不断迭代,直到找到某个东西,或者如果什么都没有找到,就结束迭代

    以下是主类中的一些草稿代码:

    public static void main(String... args) {
        List<Foo> foos = new ArrayList<Foo>();
        // TODO populate with various foos
        for (Foo foo: foos) {
            if (foo.hasFoo()) {
                // TODO something
                break;
            }
        }
    }
    static class Foo {
        boolean foo;
        public Foo(boolean value) {
            foo = value;
        }
        public boolean hasFoo() {
            return foo;
        }
    }