【问题标题】:Array Not Sorted Correctly数组未正确排序
【发布时间】:2018-07-17 18:03:58
【问题描述】:

我想按月和年对数组进行排序。我使用以下代码成功地做到了:

let formatter : DateFormatter = {
    let df = DateFormatter()
    df.locale = Locale(identifier: "en_US_POSIX")
    df.dateFormat = "MMMM yyyy"
    return df
}()

 let arrayOfMonths = ["June 2018", "July 2019", "June 2018", "July 2018", "January 2015", "June 2017"]

let sortedArrayOfMonths = arrayOfMonths.sorted( by: { formatter.date(from: $0)! < formatter.date(from: $1)! })
//prints ["January 2015", "June 2017", "June 2018", "June 2018", "July 2018", "July 2019"]

现在我已经按照正确的顺序对数组进行了排序,我想计算我有多少相同的月份。我使用以下代码成功地做到了这一点:

var counts = [Int]()
let countedSet = NSCountedSet(array: sortedArrayOfMonths)
for item in countedSet {
    counts.append(countedSet.count(for: item))
    print("\(item) : \(countedSet.count(for: item))")
}

问题是现在我的数组出现故障了。打印以下代码:

 January 2015 : 1
 July 2018 : 1
 June 2017 : 1
 July 2019 : 1
 June 2018 : 2

如何重新排序我的数组?我不确定它为什么不正常。您可以将代码放入Playgrounds 并进行测试。谢谢

【问题讨论】:

  • A Set 根据定义是无序的。您可以自己构建 NSCountedArray ????
  • 你有例子吗?我用谷歌搜索了NSCountedArray,但什么也没出现。
  • → ?? ← 没有NSCountedArray自己构建 ... 意味着您必须使用循环编写代码。
  • @TylerMiddleton vadian 的意思是它是正常的,因为 NSCountedSet 正如它的名字所指出的那样很重要,而且因为它是一个集合,所以它是无序的。您要尝试的是(不存在)NSCountedArray,这是一个可计数的数组,因为它是一个数组,所以它保持顺序。
  • 你为什么不用字典?

标签: arrays swift sorting nscountedset


【解决方案1】:

所以在操场上弄乱了代码之后。我找到了一个可行的解决方案。首先我们对数组进行排序:

let formatter : DateFormatter = {
    let df = DateFormatter()
    df.locale = Locale(identifier: "en_US_POSIX")
    df.dateFormat = "MMMM yyyy"
    return df
}()

let arrayOfMonths = ["June 2018", "July 2019", "June 2018", "July 2018", "January 2015", "June 2017"]

let sortedArrayOfMonths = arrayOfMonths.sorted( by: { formatter.date(from: $0)! < formatter.date(from: $1)! })
print(sortedArrayOfMonths)

数组排序后,我们将遍历该数组并将日期添加到新数组dqw,前提是该日期以前不存在于新数组中。然后我们将该日期出现的次数添加到另一个数组counts

var counts = [Int]()
var dqw = [String]()
let countedSet = NSCountedSet(array: sortedArrayOfMonths)
var i = 0
for item in sortedArrayOfMonths {
    if dqw.contains(item) {
        print("already exist")
    } else {
        dqw.append(item)
        counts.append(countedSet.count(for: item))
    }
}

现在我们可以循环我们创建的新dqw 数组和counts 数组并打印我们的结果。

while i < dqw.count {
   print("\(dqw[i]) : \(counts[i])")
   i += 1
}

结果:

January 2015 : 1
June 2017 : 1
June 2018 : 2
July 2018 : 1
July 2019 : 1

【讨论】:

  • 错误的解决方案。你已经排序了数组。你有countedSet,它知道排序数组中的任何项目出现了多少次。为什么必须再创建两个数组,其中dqw 与 sortedArray 是同一个数组。 counts 只是 sortedSet 已经知道的出现次数数组。在 for 循环中,您可以简单地将结果打印为 for item in sortedArrayOfMonths { print("\(item) : \(countedSet.count(for: item))") }
  • @kamran 实际上这是一个很好的解决方案!!您的建议不准确,因为您会以这种方式重复日期。我制作了一个新数组,因为我正在过滤以确保我每个月只得到一个。把我的代码放在操场上,你就会明白我在说什么。 ☺️ 可能有其他方法可以解决这个问题,但这是我目前找到的最好方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多