2016-12-16 109 views
3

的列表列表 穿越我 List Type的一類具有如下結構: 如何在它包含相同類型

class Type { 
    private String name; 
    private String level; 
    private List<Type> types; 
} 

這是我AnotherType這一個結果,我想建立。

class AnotherType { 
    private String name; 
    private List<AnotherType> types; 
} 

我建立從請求List<Type>對象是從UI來:

{ 
    "types": [ 
    { 
     "level": "1", 
     "name": "Name1" 
    }, 
    { 
     "level": "2", 
     "name": "Name2", 
     "types": [ 
     { 
      "level": "2.1", 
      "title": "Name2.1", 
      "types": [ 
      { 
       "level": "2.1.1", 
       "name": "Name2.1.1" 
      }, 
      { 
       "level": "2.1.2", 
       "title": "Name2.1.2" 
      } 
      ] 
     } 
     ] 
    }, 
    { 
     "level": "3", 
     "name": "Name3", 
     "types": [ 
     { 
      "level": "3.1", 
      "name": "Name3.1", 
      "types": [ 
      { 
       "level": "3.1.1", 
       "name": "Name3.1.1" 
      }, 
      { 
       "level": "3.1.2", 
       "name": "Name3.1.2" 
      } 
      ] 
     } 
     ] 
    } 
    ] 
} 

你可以看到每個types可以有,也可以是null

我不知道它有多深。

我的問題是我如何遞歸(或可能迭代)遍歷到這個List<Type>和構造List<AnotherType>

在此先感謝。

+0

你試圖做什麼?提供你的一段代碼,也許我們會幫你弄清楚什麼是錯的。 –

+0

我試圖用'Order Traversals'來構建它,並試圖使用'Level Order Traversal'來構建它,但看起來這是完全不同的結構 – user7203701

+0

請提供一段代碼,沒有人會爲您完成全部任務。人們在這裏不做任何「功課」。 –

回答

1

首先,在你的類添加getter/setter方法來訪問和修改你的私人領域。然後,您可以使用以下方法遞歸地將Type轉換爲AnotherType

public AnotherType toAnotherType(Type type) { 

    AnotherType anotherType = new AnotherType(); 
    anotherType.setName(type.getName()); 

    if (type.getTypes() != null && !type.getTypes().isEmpty()) { 

     List<AnotherType> lAnotherTypes = new ArrayList<>(); 

     for(Type innerType : type.getTypes()) { 
      AnotherType innerAnotherType = toAnotherType(innerType); 
      lAnotherTypes.add(innerAnotherType); 
     } 
     anotherType.setTypes(lAnotherTypes); 
    } 

    return anotherType; 
} 

然後有這種方法,你可以在List<Type>遍歷一次,並呼籲toAnotherType方法爲每Type

List<AnotherType> allAnotherTypes = new ArrayList<>(); 

for (Type type : types) { 
    AnotherType anotherType = toAnotherType(type); 
    allAnotherTypes.add(anotherType); 
} 

希望這有助於。

+0

是的。這正是我所期待的。 。謝謝! – user7203701

0

你可以箱子運行對列表中的所有類相同的功能,然後返回答案pluss它自上你的類的功能。

像這樣的事情

class Myclass 
{ 
    list<Myclass> items = new List<Myclass>(); 

    List<Myclass> GetItems() 
    { 
    var result = items.SelectMany(a => a.GetItems()).Tolist(); 
    result.add(this); 
    return result; 
    } 
} 
0

遞歸的僞代碼(無支架格式化):

function WalkList(List<Type> aList, int aLevel = 0) 
    if (aList) //not null 
     output aList.name, level after aLevel spaces 
     WalkList(aList.types, aLevel + 1) 
+0

我沒有得到這部分:aLevel空間之後的水平 – user7203701

+0

這是最簡單的樹型輸出格式:當你使用名稱形成輸出字符串時,在字符串中插入一些空格,開始爲不同級別製作不同的縮進(最好插入4 * aLevel空格) – MBo

+0

PS數據處理不需要 – MBo

0

首先,如果你的類是這樣的,沒有人能夠訪問他們 - 所有成員是私人的,沒有獲取者/設置者或公共構造者將初始化私人成員。一旦你解決這個問題,轉換的代碼如下:

List<AnotherType> convert(List<Type> tList) { 
    if(tList == null) 
     return null; 
    List<AnotherType> retVal = new ArrayList<AnotherType>(); 
    for(Type t : tList) { 
     List<AnotherType> aTypes = convert(t.types); 
     retVal.add(new AnotherType(t.name, aTypes)); 
    } 
    return retVal; 
} 
1

也許你正在尋找類似的模型映射器,E。 G。 modelmapper.org

通過你的對象,否則遍歷可以通過多種方式來完成。一種可能性:

AnotherType transform(Type type) { 
    if (type == null) { 
    return null; 
    } 
    AnotherType anotherType = new AnotherType(); 
    anotherType.name = type.name; 
    if (type.types != null) { 
    anotherType.types = type.types.stream() 
     .map(this::transform) 
     .collect(Collectors.toList()); 
    } 
    return anotherType; 
} 

然後調用該函數,如:

Type toTransform ... 
AnotherType anotherType = transform(toTransform); 

(當然是:添加改性劑和知名度取決於你的需求)

相關問題