假设我在类似于此类的类中设置了自定义对象。
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();
}
然后我该怎么做才能找到数组中第一个id为2的对象(例如)?
答案 0 :(得分:2)
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
。
答案 1 :(得分:1)
有多种方法可以解决这个问题。首先,您可以执行一个简单的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搜索,则可以实现Comparable。然后,您可以使用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)
。
答案 2 :(得分:0)
除了迭代它们并手动检查之外别无他法,就像Matthew给你看的那样。您可以按照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) {
...
}
执行此操作的最佳方式取决于您的主要用例,实际上以及您计划支持的元素数量。
答案 3 :(得分:0)
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")
答案 4 :(得分:0)
使用Commons Collections: http://commons.apache.org/collections/apidocs/org/apache/commons/collections/CollectionUtils.html#find(java.util.Collection,org.apache.commons.collections.Predicate)