使用特定变量查找数组中的自定义对象
假设我在类中设置了一个自定义对象。使用特定变量查找数组中的自定义对象
public class anObject {
public String id, otherProperty;
public anObject(){
this.id = "1";
this.otherProperty = "cat";
}
}
然后我在另一个类
anObject[] objects = new anObject[40];
for(int i=0; i < 40; i++){
objects[i] = new anObject();
}
我能做些什么,然后发现有2的ID数组中的第一个对象创建这些对象的数组(例如)?
anObject found = null;
for(int i=0; i < 40; i++){
if ("2".equals(object[i].id)) {
// found it
found = object[i];
break; // exit the loop
}
}
或者我错过了什么?
编辑:增加了break
。此外,还有一个约定,即类名以大写字母开头,如AnObject
。
除了迭代它们并手动检查外,没有别的办法了,正如马修向你展示的那样。您可以按照ID的顺序存储它们,并执行类似二进制搜索的操作,以将时间缩短至O(log(n))
而不是O(n)
,但这可能会造成太大的开销。
您可以尝试将它们存储在Map<String, YourObject>
中,并且只需执行map.get(id)
即可。这有O(1)
访问时间。
Map<String, YourObject> map = new HashMap<String, YourObject>();
for (int i=0; i < 40; i++) {
YourObject obj = new YourObject(); // couldn't put anObject, it bugged me :)
map.put(obj.id, obj);
}
// get object with id = 2
YourObject secondOne = map.get("2");
if (secondOne != null) {
...
}
做到这一点取决于你的主要用例,真的和你打算支持多少个元素的最好方法。
public static anObject findById(anObject[] arr,String str) {
for (anObject obj:arr) if (obj.id.equals(str)) return obj;
return null;
}
然后调用anObject.findById(objects,"2")
使用共享类别: http://commons.apache.org/collections/apidocs/org/apache/commons/collections/CollectionUtils.html#find(java.util.Collection,org.apache.commons.collections.Predicate)
还有的要对此多种方式。首先,你可以做一个简单的for循环,遍历所有的对象,直到找到一个具有特定id的对象。您搜索的复杂性将是O(N)
anObject obj = null;
dance: for(int i = 0; i < objects.length; i++)
{
if(object[i].id == 2)
{
obj = object[i];
break dance;
}
}
,如果你知道你总是要通过ID来搜索,你可以实现媲美。然后,您可以使用java.util.Arrays
为您排序和搜索阵列。这将减少你的搜索O(log n)
public class anObject implements Comparable {
public String id, otherProperty;
public anObject(){
this.id = "1";
this.otherProperty = "cat";
}
public int compareTo(Object o)
{
if(o instanceof anObject)
{
return this.id.compareTo(((anObject) other).id);
}
return -1;
}
}
最后选项,您可以将结果存储在Map<String, anObject>
。如果您正在进行大量搜索,这是最好的方法,因为它会以增加的内存为代价进行搜索O(1)
。
你只是想念那个* id *是一个* String *;) – m0skit0 2012-02-08 15:41:07
@ m0skit0是的,更正了:-) – 2012-02-08 15:45:56
我知道这很简单,但是这段代码会找到所有的id为2的对象不是吗?我如何取消循环,使其只获得第一个循环? – Jack 2012-02-08 15:46:13