2016-08-08 24 views
3

Ich muss Dateien in alphabetischer Reihenfolge speichern.
Nun mein Code Speichern von Dateien in numerischer ReihenfolgeWie man String in Swift inkrementiert

1.png
2.png
3.png
...

Das Problem ist, wenn ich diese wieder lesen Dateien Ich lese diese Dateien wie beschrieben here


So dachte ich über die Änderung des Codes und s ave die Dateien nicht in einer numerischen Reihenfolge, sondern in einer alphabetischen Reihenfolge wie:

a.png
B.png
c.png
...
z.png
aa.png
ab.png
...

Aber in Swift ist es schwierig, auch Charakter Art zu erhöhen.
Wie kann ich beginnen ab:

var s: String = "a" 

und s auf diese Weise erhöhen?

+0

So möchten Sie diese numerischen Namen auf diejenigen kartieren Buchstaben enthalten? Was hat das mit Inkrementieren zu tun? – Alexander

+0

nein. So speichere ich jetzt die Dateien. Ich habe daran gedacht, die Dateien in alphabetischer Reihenfolge zu speichern, anstatt wie bisher numerisch. Ich werde versuchen, es besser zu erklären. – Danny182

+0

'Ich habe daran gedacht, die Dateien in alphabetischer Reihenfolge anstatt in numerischer Reihenfolge zu speichern. '... Sie möchten also diese numerischen Namen denen zuordnen, die Buchstaben enthalten. – Alexander

Antwort

1

Fügen Sie diesen Code in die Spielfläche ein und überprüfen Sie das Ergebnis. n Nummern unterstützt bedeutet, dass Sie eine beliebige hohe Zahl eingeben können wie: 99999999999999 enjoy!

Sie können for loop Code auskommentieren, um Code zu überprüfen funktioniert gut oder nicht , aber vergessen Sie nicht zuweisen niedrigeren Wert counter Variable andernfalls Xcode wird einfrieren.

//: Playground - noun: a place where people can play 

import UIKit 

var fileName:String 
var counter:Double = 0 
var alphabets:Array = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"] 
let totalAlphaBets:Double = 26.0 
let numFiles = 9999 


func getCharacter(counter c:Double) -> String { 

    var chars:String; 
    var divisionResult:Int = Int(c/totalAlphaBets) 
    let modResult:Int = Int(c % totalAlphaBets) 

    chars = getCharFromArr(index: modResult) 

    if(divisionResult != 0){ 

     divisionResult -= 1; 

     if(divisionResult > alphabets.count-1){ 
      chars = getCharacter(counter: Double(divisionResult)) + chars 
     }else{ 
      chars = getCharFromArr(index: divisionResult) + chars 
     } 
    } 

    return chars; 
} 

func getCharFromArr(index i:Int) -> String { 
    if(i < alphabets.count){ 
     return alphabets[i]; 
    }else{ 
     print("wrong index") 
     return "" 
    } 
} 

//for _ in 0...numFiles { 
// fileName = getCharacter(counter: counter) 
// print(fileName) 
// counter += 1; 
//} 

fileName = getCharacter(counter: numFiles)+".png" 
4

Sie können es numerisch halten, genau die richtige Option beim Sortieren:

let arr = ["1.png", "19.png", "2.png", "10.png"] 

let result = arr.sort { 
    $0.compare($1, options: .NumericSearch) == .OrderedAscending 
} 

// result: ["1.png", "2.png", "10.png", "19.png"] 
0

Wenn Sie wirklich möchten, dass alphabetisch machen, versuchen Sie diesen Code die Namen zu erhöhen:

/// Increments a single `UInt32` scalar value 
func incrementScalarValue(_ scalarValue: UInt32) -> String { 
    return String(Character(UnicodeScalar(scalarValue + 1))) 
} 

/// Recursive function that increments a name 
func incrementName(_ name: String) -> String { 
    var previousName = name 
    if let lastScalar = previousName.unicodeScalars.last { 
     let lastChar = previousName.remove(at: previousName.index(before: previousName.endIndex)) 
     if lastChar == "z" { 
      let newName = incrementName(previousName) + "a" 
      return newName 
     } else { 
      let incrementedChar = incrementScalarValue(lastScalar.value) 
      return previousName + incrementedChar 
     } 
    } else { 
     return "a" 
    } 
} 

var fileNames = ["a.png"] 
for _ in 1...77 { 
    // Strip off ".png" from the file name 
    let previousFileName = fileNames.last!.components(separatedBy: ".png")[0] 
    // Increment the name 
    let incremented = incrementName(previousFileName) 
    // Append it to the array with ".png" added again 
    fileNames.append(incremented + ".png") 
} 

print(fileNames) 
// Prints `["a.png", "b.png", "c.png", "d.png", "e.png", "f.png", "g.png", "h.png", "i.png", "j.png", "k.png", "l.png", "m.png", "n.png", "o.png", "p.png", "q.png", "r.png", "s.png", "t.png", "u.png", "v.png", "w.png", "x.png", "y.png", "z.png", "aa.png", "ab.png", "ac.png", "ad.png", "ae.png", "af.png", "ag.png", "ah.png", "ai.png", "aj.png", "ak.png", "al.png", "am.png", "an.png", "ao.png", "ap.png", "aq.png", "ar.png", "as.png", "at.png", "au.png", "av.png", "aw.png", "ax.png", "ay.png", "az.png", "ba.png", "bb.png", "bc.png", "bd.png", "be.png", "bf.png", "bg.png", "bh.png", "bi.png", "bj.png", "bk.png", "bl.png", "bm.png", "bn.png", "bo.png", "bp.png", "bq.png", "br.png", "bs.png", "bt.png", "bu.png", "bv.png", "bw.png", "bx.png", "by.png", "bz.png"]` 

Sie werden schließlich am Ende mit

a.png
B.png
c.png
...
z.png
aa.png
ab.png
...
zz.png
aaa.png
aab.png
...