查找对象数组中是否存在字符串/对象

时间:2015-10-22 11:46:05

标签: java arrays

我有一个从数据库中检索多个值的对象列表,如下所示:

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

结果如下所示(在控制台上打印出来,每个都是通过):

{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}

获得asset_id = 2的对象或asset_id(1和2)数组并将结果放入另一个数组的最快和/或最有效的方法是什么?

我打算将每个对象转换为字符串,然后将每个字符串转换为数组(用逗号分隔),然后将数组的每个项目转换为另一个数组(或者一个hashmap) )使用=,但这似乎是一种长而复杂的嵌套for循环方式,可能会失败(请参阅比较资产数组)。

也许还有另一种更快/更简单的方法来做到这一点,我错过了?有什么建议?感谢。

编辑:作为参考,这是getLaptopsForRequest函数:

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

它返回查询结果的列表。由于此代码已经到位,我允许编辑它。

3 个答案:

答案 0 :(得分:1)

您要做的主要是过滤对象列表。您可以实现为列表编写自己的迭代器的过滤器模式。

只需扩展此类即可实现您自己的过滤器。

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

然后以这种方式使用它:

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

答案 1 :(得分:1)

假设你的对象有getter和setter方法。

只有asset_id =&#34; 2&#34;,asset_id这里是字符串的对象

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

答案 2 :(得分:1)

快速而肮脏的解决方案是将每个项目与正则表达式^.*asset_id=([0-9]+).*$匹配。

如果您从该方法获得的内容确实是包含这些JSON的字符串列表,您可以创建一个模型类并使用JSON序列化程序(如GSONJackson)将字符串读入Java对象,然后你可以使用它们。