如何在Swift中递增字符串

5

我需要按字母顺序保存文件。
目前我的代码是按数字顺序保存文件。

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

问题在于当我再次读取这些文件时,我会像这里描述的那样读取这些文件。


所以我想改变代码,将文件不按数字顺序而是按字母顺序保存,如下:

a.png
b.png
c.png
...
z.png
aa.png
ab.png
...

但在Swift中,即使是Character类型也很难递增。
我该如何开始:

var s: String = "a"

并且以这种方式增加s吗?

所以你想将那些数字名称映射到包含字母的名称中?这与递增有什么关系? - Alexander
不,这是我现在保存文件的方式。我在考虑将文件按字母顺序保存,而不是像现在这样按数字顺序。我会尽力解释得更清楚。 - DanielZanchi
我在考虑将文件按字母顺序保存,而不是像现在这样按数字顺序保存。...所以您想将那些数字名称映射到包含字母的名称上。 - Alexander
@Danny182:你看过我的回答了吗? - Milan V.
3个回答

4
您可以保持数字,只需在排序时使用正确的选项:

您可以保持数字,只需在排序时使用正确的选项:

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"]

2
如果你真的想让它们按字母顺序排列,可以尝试使用以下代码来递增名称:
/// 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"]`

最终你会得到以下文件:

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


1
将此代码粘贴到游乐场并检查结果。支持n个数字,这意味着您可以输入任何高数字,例如99999999999999,尽情享受!您可以取消注释for loop代码以检查代码是否正常工作,但不要忘记将较小的值分配给counter变量,否则Xcode将会冻结。
var fileName:String = ""
var counter = 0.0
var alphabets = ["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(alphabets.count)
let numFiles = 9999


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

    var chars:String
    var divisionResult = Int(c / totalAlphaBets)
    let modResult = Int(c.truncatingRemainder(dividingBy: 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)+".png"
    print(fileName)
    counter += 1
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接