Поиск пользовательских объектов в массиве с определенной переменной - PullRequest
0 голосов
/ 08 февраля 2012

Предположим, у меня есть пользовательский объект, настроенный в классе, подобном этому.

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 (например)?

Ответы [ 5 ]

2 голосов
/ 08 февраля 2012
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 голос
/ 08 февраля 2012

Есть несколько способов сделать это. Во-первых, вы можете сделать простой цикл for, перебирая все объекты, пока не найдете объект с определенным идентификатором. Ваша сложность поиска будет 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), за счет дополнительной памяти.

0 голосов
/ 08 февраля 2012

Использование коллекций Commons: http://commons.apache.org/collections/apidocs/org/apache/commons/collections/CollectionUtils.html#find(java.util.Collection, org.apache.commons.collections.Predicate)

0 голосов
/ 08 февраля 2012
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")

0 голосов
/ 08 февраля 2012

Нет другого способа, кроме как проходить через них и проверять вручную, как показал вам Мэтью. Вы можете сохранить их в порядке идентификатора и выполнить что-то вроде бинарного поиска, чтобы сократить время до 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) {
    ...
}

Лучший способ сделать это зависит от ваших основных сценариев использования и от того, сколько элементов вы планируете поддерживать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...