2013-11-27 59 views
1

如果您有具有List<Object> list其元素本身可以指的是也有List<Object> list,它的元素本身可以指的是也有List<Object> list等物體對象的對象。 ..你想在這個結構中找到一個特定類型的對象。獲得通過一系列的列表<Object>名單

達到此目的的最佳方法是什麼?

我目前的做法是迭代遍歷第一個列表,詢問每個元素obj.getClass() == XYZ.class,如果是的話,接受元素,投射它,得到它的List<Object> list並繼續像以前一樣。

我被綁定到這些列表,因爲這些類是從XSD架構生成的JAXB。

所有這些迭代和鑄件是一個巨大的混亂,並期待不高明...

+4

我相信你可以重構你的結構,以便JAXB創建POJO實例而不是List對象。 –

+0

創建一個遞歸函數來結構化。 – sjkm

+0

@SotiriosDelimanolis對不起,我不確定我理解。用'重構你的結構'你的意思是我的XSD?恐怕這是不可能的,因爲還有其他應用程序(第三方Web服務)已經使用這些excact XSD,並且我的應用程序應該支持與那些現有應用程序相同的數據結構。 XSD不是由我製作的,我沒有對它們進行適當的瞭解。 – dave

回答

0

我認爲你可以使用這種遞歸函數:

public List<Test> getTestElements(List<Object> list) { 
    List<Test> result = new ArrayList<Test>(); 
    for (Object o : list) { 
     if (o instanceof Test) { 
      result.add((Test) o); 
     } else if (o instanceof List) { 
      result.addAll(getTestElements((List<Object>) o)); 
     } 
    } 
    return result; 
} 

這將返回列表所有出現在輸入列表中的Test對象。

0
  1. 你不應該使用遞歸函數。它可能會導致Stackoverflow異常
  2. 認爲你的數據結構就像一棵樹(有節點和子節點)。使用BFS(廣度優先搜索)遍歷樹並找到並保留匹配的對象。
  3. BFS:http://en.wikipedia.org/wiki/Breadth-first_search
  4. 使用Java隊列實現BFS。