使用特定变量查找数组中的自定义对象

问题描述:

假设我在类中设置了一个自定义对象。使用特定变量查找数组中的自定义对象

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

+0

你只是想念那个* id *是一个* String *;) – m0skit0 2012-02-08 15:41:07

+0

@ m0skit0是的,更正了:-) – 2012-02-08 15:45:56

+0

我知道这很简单,但是这段代码会找到所有的id为2的对象不是吗?我如何取消循环,使其只获得第一个循环? – Jack 2012-02-08 15:46:13

除了迭代它们并手动检查外,没有别的办法了,正如马修向你展示的那样。您可以按照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")

还有的要对此多种方式。首先,你可以做一个简单的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)