0

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.

2
  • 1
    What is the return type of daoManager.getLaptopsForRequest? Maybe you can do better then assign it to a List<Object>. Commented Oct 22, 2015 at 11:50
  • @Seelenvirtuose, Returns a list. I updated the code. The daoManager part is something I cannot edit, so I'm stuck with modifying the results. Commented Oct 22, 2015 at 11:56

3 Answers 3

1

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.

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks. Gave me an idea to use for loops and regex.
1

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); 
 } 

Comments

1

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();

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.