2013-06-19 134 views
-2

基本上我想編寫一個函數,接受一個類型T和搜索的列表與給定的字段名稱的給定值。通過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。

+0

-ve點?這個問題有什麼不對? –

回答

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()) 
    } 
    //... 

但這種做法的問題是,它會被限制在一定的場(S)。

0

你應該能夠創建一個通用的實體A和具有在實體getfield命令的方法。此後,使用List < T擴展A>以確保可以使用getField。

或者,您可以使用反射來檢查getField方法是否存在。但這會很慢。

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

反射是你需要研究的。

雖然使用手工編寫的反思是去工作,因爲你提到getField,我強烈建議你看看所有這些bean的工具。

例如,Apache Commons BeanUtils

你可以這樣做:

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