zack_falcon
zack_falcon

Reputation: 4386

Find if string / object is present in array of objects

I have an object list that retrieves multiple values from a database, like so:

List<Object> listRequest = daoManager.getLaptopsForRequest(BigInteger.valueOf(itemTransItem.getAssetType().getId()), BigInteger.valueOf(approverId));

The result of which looks like this (printed out on the console, via for each):

{asset_type_id=1, inventory_id=1, from_dt=2015-09-18 18:04:55.77, id=1, asset_id=1, status=1, thru_dt=null}
{asset_type_id=1, inventory_id=1, from_dt=2015-09-18 18:04:55.77, id=2, asset_id=2, status=1, thru_dt=null}
{asset_type_id=1, inventory_id=1, from_dt=2015-09-18 18:04:55.77, id=3, asset_id=3, status=1, thru_dt=null}

What's the quickest and/or most efficient way to get only the object where asset_id = 2, or an array of asset_id (1 and 2), and putting the results in another array?

I contemplated casting each object as a string, and then turning each string into an array (split by the comma), and then turning each item of the array into a further array (or a hashmap) by using the =, but that seems like a long, long, complex way of nested for loops that might fail (see comparing array of assets).

Perhaps there's another quicker / less complex way to do this that I'm missing? Any suggestions? Thanks.

EDIT: For reference, here's the getLaptopsForRequest function:

public List getLaptopsForRequest(BigInteger asset_type_id, BigInteger party_id){
    SQLQuery query = sessionFactory.getCurrentSession().createSQLQuery(laptopsForRequestSql);
    query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
    List forRequest = query.setBigInteger(0, asset_type_id).setBigInteger(1, party_id).list();
    return forRequest;
}

It returns a list of the results of the query. As this code has been in place, I'm not allowed to edit it.

Upvotes: 0

Views: 95

Answers (3)

Jiri Tousek
Jiri Tousek

Reputation: 12450

A quick and dirty solution would be to match each item against regex ^.*asset_id=([0-9]+).*$.

If what you're getting from that method is indeed a list of Strings containing those JSONs, you could create a model class and use a JSON serializer like GSON or Jackson to read the strings into Java objects, and then you could work with them.

Upvotes: 1

Tahar Bakir
Tahar Bakir

Reputation: 716

Assuming your objects have getter et setter methods.

Only the object where asset_id = "2", asset_id here being a string

 listRequest.stream().filter(e -> e.getAssetId() == "2" ).toArray();

Upvotes: 1

Luca S.
Luca S.

Reputation: 1162

What you are trying to do basically is to filter a list of objects. You could implement the Filter Pattern writing your own Iterator for the list.

Just extends this class to implement your own filter.

public abstract class Filter<T> {
  public abstract boolean passes(T object);

  public Iterator<T> filter(Iterator<T> iterator) {
    return new FilterIterator(iterator);
  }

public Iterable<T> filter(Iterable<T> iterable) {
    return new Iterable<T>() {
        public Iterator<T> iterator() {
            return filter(iterable.iterator());
        }
    };
}

private class FilterIterator implements Iterator<T> {
    private Iterator<T> iterator;
    private T next;

    private FilterIterator(Iterator<T> iterator) {
        this.iterator = iterator;
        toNext();
    }

    public boolean hasNext() {
        return next != null;
    }

    public T next() {
        if (next == null)
            throw new NoSuchElementException();
        T returnValue = next;
        toNext();
        return returnValue;
    }

    public void remove() {
        throw new UnsupportedOperationException();
    }

    private void toNext() {
        next = null;
        while (iterator.hasNext()) {
            T item = iterator.next();
            if (item != null && passes(item)) {
                next = item;
                break;
            }
        }
    }
}
}

and then use it in this way:

List<MyObject> newList = new ArrayList<MyObject>();
for(MyObject obj : filter.filter(listObjs) ){
      newList.add(obj); 
 } 

Upvotes: 1

Related Questions