迭代T类型列表并搜索值

时间:2013-06-19 00:03:05

标签: java list search generics types

基本上我想编写一个函数,它接受类型为T的列表并搜索给定字段名称的给定值。

@SuppressWarnings("unchecked")
public static boolean listContains( List<T> source, String field, String value ) {
     for ( T t : source ) {
         if ( t.get[field]().equals(value) ) // the getField needs to be dynamic. reflection only way? 
             return true;
     }
     return false;
}

有什么想法吗?

如果字段(getField)不存在,那么它应该只返回false。

4 个答案:

答案 0 :(得分:1)

您的方法不是通用的,因为它应该接受任何类型的对象,您可以将列表类型更改为List<?> source

public static boolean listContains(List<?> source, String field, String value) {
    for (Object obj : source ) {
        try {
            Field f = obj.getClass().getDeclaredField(field); //get the field using name
            f.setAccessible(true);
            Object val = f.get(obj); //the value of the field in the current object
            if(value.equals(val)) { //if it equals to passed value
                return true;        //return true
            }
        } catch (NoSuchFieldException e) { //if the object doesn't have the field
            return false;                  //return false
        } catch (Exception e) { //their are other exceptions
            throw new RuntimeException(e); //how ever you want to handle
        }
    }
    return false; 
}

您可以创建一个超类型并使您的方法如下(以避免使用反射) -

public static boolean listContains(List<? extends MyObject> source, String value) {        
    for (MyObject obj : source ) {
        //...
        //... value.equals(obj.getField())
    }
    //...

但这种方法的问题在于它会受到某些领域的限制。

答案 1 :(得分:0)

您应该能够创建通用实体A并在该实体中拥有getField方法。此后,使用List&lt; T延伸A>确保可以使用getField。

或者,您可以使用反射来检查getField方法是否存在。但这会很慢。

答案 2 :(得分:0)

考虑flollwoing示例。

        public class BST<E extends Comparable<E>> 
            extends AbstractTree<E> {
            protected TreeNode<E> root;
            protected int size = 0;

           /** Create a default binary tree */
             public BST() {
            }

           /** Create a binary tree from an array of objects */
          public BST(E[] objects) {
          for (int i = 0; i < objects.length; i++)
          insert(objects[i]);
          }

          @Override /** Returns true if the element is in the tree */
          public boolean search(E e) {
          TreeNode<E> current = root; // Start from the root

          while (current != null) {
          if (e.compareTo(current.element) < 0) {
          current = current.left;
          }
          else if (e.compareTo(current.element) > 0) {
          current = current.right;
          }
          else // element matches current.element
          return true; // Element is found
          }

          return false;
          }

答案 3 :(得分:0)

反思是你需要研究的。

虽然使用Reflection的手工制作会起作用,但鉴于你已经提到getField,我强烈建议你研究所有这些bean工具。

例如,Apache Commons BeanUtils

您可以执行以下操作:

return PropertyUtils.isReadable(obj, field)
       && value.equals(PropertyUtils.getSimpleProperty(obj, field));