查找 ArrayList 中的对象是否具有特定字段
Find if object in ArrayList has a specific field
我试图查明 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 循环来完成,但我不确定该怎么做。如果我说的有道理,请回复。
假设一个单线程场景,你应该:
- 使用对象的 class 参数化
ArrayList
的类型,而不是使用 Object
- 不要使用
while
循环,而是使用 for
或增强的 for
循环迭代 ArrayList<YourObject>
,并在任一元素具有所需值时中断对于您的 boolean
属性,通过调用它的 getter
- 这没有针对任何措施进行优化,它会一直迭代直到找到某些东西,如果找不到则结束迭代
主要 class 中的一些代码草案:
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;
}
}
反思就是你的答案。
而不是while循环我更喜欢Iterator接口,
遍历列表并为每个对象尝试这个:
while(itr.hasNext()){
Object someObject = itr.next();
for (Field field : someObject.getClass().getDeclaredFields()) {
field.setAccessible(true); // You might want to set modifier to public first.
Object value = field.get(someObject);
if (value != null) {
System.out.println(field.getName() + "=" + value);
}
}
}
当您说 Object o1 = new Object();
时,您不是在谈论 java.lang.Object
,对吧?因为 java.lang.Object
的字段是在 javadoc
中定义的,您不能请求某种 booleanfield
,它不会存在。
如果ArrayList
包含几种对象,您可以使用instanceof
或.getClass()
来知道class对象属于。
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的回答。
我试图查明 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 循环来完成,但我不确定该怎么做。如果我说的有道理,请回复。
假设一个单线程场景,你应该:
- 使用对象的 class 参数化
ArrayList
的类型,而不是使用Object
- 不要使用
while
循环,而是使用for
或增强的for
循环迭代ArrayList<YourObject>
,并在任一元素具有所需值时中断对于您的boolean
属性,通过调用它的 getter - 这没有针对任何措施进行优化,它会一直迭代直到找到某些东西,如果找不到则结束迭代
主要 class 中的一些代码草案:
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;
}
}
反思就是你的答案。
而不是while循环我更喜欢Iterator接口, 遍历列表并为每个对象尝试这个:
while(itr.hasNext()){
Object someObject = itr.next();
for (Field field : someObject.getClass().getDeclaredFields()) {
field.setAccessible(true); // You might want to set modifier to public first.
Object value = field.get(someObject);
if (value != null) {
System.out.println(field.getName() + "=" + value);
}
}
}
当您说 Object o1 = new Object();
时,您不是在谈论 java.lang.Object
,对吧?因为 java.lang.Object
的字段是在 javadoc
中定义的,您不能请求某种 booleanfield
,它不会存在。
如果ArrayList
包含几种对象,您可以使用instanceof
或.getClass()
来知道class对象属于。
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的回答。