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

时间:2012-02-08 15:37:11

标签: java arrays class object for-loop

假设我在类似于此类的类中设置了自定义对象。

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的对象(例如)?

5 个答案:

答案 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)