2016-04-14 5 views
0

У меня есть массив, как показано ниже, с 13 элементами.Array in Array Swift

var data =[“MonthFolder/", 
"MonthFolder/January", 
"MonthFolder/February", 
"MonthFolder/March", 
"DayFolder/", 
"DayFolder/Monday", 
"DayFolder/Tuesday", 
"DayFolder/Wednesday", 
"DayFolder/Thursday", 
"YearFolder/", 
"YearFolder/2016", 
"YearFolder/2015", 
"YearFolder/2014"] 

Я пытаюсь напечатать массив с конечным результатом, как показано ниже

[("MonthFolder/January","MonthFolder/February","MonthFolder/March"), 
("DayFolder/Monday","DayFolder/Tuesday","DayFolder/Wednesday","DayFolder/Thursday"), 
("YearFolder/2016", "YearFolder/2015”, "YearFolder/2014")]” 

Я сделал это

var fileName = [AnyObject]() 
var allFiles = [AnyObject]() 

for item in data{ 

    let keyString = item.characters.last 

    if keyString != "/"{ 
     fileName.append(item) 
    } 
    else if keyString == "/"{ 
     if fileName.count > 0{ 
      allFiles.append(fileName) 
      fileName = [] 
     } 
    } 
} 

и получил выход в

[("MonthFolder/January","MonthFolder/February","MonthFolder/March"), 
("DayFolder/Monday","DayFolder/Tuesday","DayFolder/Wednesday","DayFolder/Thursday”)] 

отсутствующего третий объект в allFiles bec ause else, если условие не выполняется для последней итерации. Как достичь желаемого результата? Спасибо.

+0

Вы проверили мой ответ? – Pushpa

+0

Спасибо Пушпа. Это работало. – Rio

+0

@Rio Если это сработало, подпишите ответ Пушпы как правильный – Andrea

ответ

0

К таким образом, вы получите ожидаемый результат:

var fileName = [AnyObject]() 
var allFiles = [AnyObject]() 

for item in data{ 

    let keyString = item.characters.last 

    if keyString != "/"{ 
    fileName.append(item) 
    } 
    else if keyString == "/"{ 
    if fileName.count > 0{ 
     allFiles.append(fileName) 
     fileName = [] 
    } 
    } 
} 
if fileName.count != 0 { 
    allFiles.append(fileName) 
    fileName = [] 
} 

Надежда это поможет вам :)

0

Я попытался это

 


    var data = ["MonthFolder/", "MonthFolder/January", "MonthFolder/February", "MonthFolder/March", "DayFolder/", "DayFolder/Monday", "DayFolder/Tuesday", "DayFolder/Wednesday", "DayFolder/Thursday", "YearFolder/", "YearFolder/2016", "YearFolder/2015", "YearFolder/2014"]; 
    var fileName = [] 
    for (item in data) {   
     var keyString = data[item].split("/"); 
     if(keyString[1] == "") 
      { 
       var keyV = keyString[0]; 
       fileName[keyV]= new Array(); 
      } 
      else 
      { 
       fileName[keyV].push(data[item]);     
      } 
    } 
    console.log(fileName) 

и я получил выход как

 
[ 


DayFolder 
    ["DayFolder/Monday", "DayFolder/Tuesday", "DayFolder/Wednesday", "DayFolder/Thursday"] 

MonthFolder 
    ["MonthFolder/January", "MonthFolder/February", "MonthFolder/March"] 

YearFolder 
    ["YearFolder/2016", "YearFolder/2015", "YearFolder/2014"] 
    ] 

Пожалуйста, проверьте

0

Функциональный способ:

var data = ["MonthFolder/", 
      "MonthFolder/January", 
      "MonthFolder/February", 
      "MonthFolder/March", 
      "DayFolder/", 
      "DayFolder/Monday", 
      "DayFolder/Tuesday", 
      "DayFolder/Wednesday", 
      "DayFolder/Thursday", 
      "YearFolder/", 
      "YearFolder/2016", 
      "YearFolder/2015", 
      "YearFolder/2014"] 

var allFolders = [String]() 
var allFiles = [String]() 

func gatherFiles(files: [String], inFolders folders: [String]) -> [[String]] { 
     return folders.map { folder in 
      return (files.filter { $0.containsString(folder)}) 
     } 
    } 

for item in data { 
    let components = item.componentsSeparatedByString("/").filter({!$0.isEmpty}) 
    if components.count > 1 { 
     allFiles.append(item) 
    } else { 
     allFolders.append(item) 
    } 
} 

let finalArr = gatherFiles(allFiles, inFolders: allFolders) 

Примечание

  • Минусы: с таким образом, есть больше итераций.
  • Плюсы: вы можете его повторно использовать?
0

Попробуйте

data.forEach { (item) ->() in 
    if item.characters.last != "/" { 
     fileName.append(item) 
    } else if fileName.count > 0 { 
     allFiles.append(fileName) 
     fileName = [] 
    } 
} 
allFiles.append(fileName) 
print(allFiles) 
0

Вы также можете использовать более общий подход, основанный на словарь STRUCT

var filesDict = [String : [String]]() 

for fileName in data { 
    let fileComponents = fileName.componentsSeparatedByString("/") 
    let fileKey = fileComponents[0] 
    let fileValue = fileComponents[1] 

    var itemsArray = filesDict[fileKey] 
    if itemsArray == nil { 
     itemsArray = [] 
    } 

    if fileValue != "" { 
     itemsArray!.append(fileName) 
    } 
    filesDict[fileKey] = itemsArray 
} 

//conversion from Dictionary to Array 
let outputArray = Array(filesDict.values) 
print(outputArray) 

выход

[["MonthFolder/January", "MonthFolder/February", "MonthFolder/March"], 
["DayFolder/Monday", "DayFolder/Tuesday", "DayFolder/Wednesday", "DayFolder/Thursday"], 
["YearFolder/2016", "YearFolder/2015", "YearFolder/2014"]]