【问题标题】:Sorting Dictionary of Strings and Numbers字符串和数字的排序字典
【发布时间】:2013-11-21 19:48:10
【问题描述】:

我有一个字典对象需要排序,但是键是表单中的日期值

['四月。 2013 年','2013 年 5 月','2 月。 2013', '三月。 2013','七月。 2013','八月。 2013', '九月。 2013','十月。 2013','六月。 2013','11 月2013']

如您所见,日期不正确。每个键对应的值是一个数字。我想按时间顺序对它们进行排序。但是,由于月份是字符串值,而且月份不是按字母顺序排列的,因此我不能自动对它们进行排序。此外,虽然代码示例中没有显示,但也有可能不是 2013 年。我将如何对这本字典进行排序?

提前致谢!

【问题讨论】:

  • 所以您想按字典的值对字典进行排序?还是通过它的钥匙?

标签: sorting dictionary asp-classic vbscript


【解决方案1】:

here盗取的代码:

  Const csSep = "|"
  Const cnMax = 100

  Dim sInp : sInp = "Apr. 2013|May. 2013|Apr. 2014|Feb. 2013|Apr. 2011|Mar. 2013|Jul. 2013|Aug. 2013"
  Dim aInp : aInp = Split(sInp, csSep) ' YourDic.Keys
  WScript.Echo "A:", vbCrLf & Join(aInp, vbCrLf)
  WScript.Echo "---------------------"

  Dim oNAL : Set oNAL = CreateObject( "System.Collections.ArrayList" )
  Dim oSB  : Set oSB  = CreateObject( "System.Text.StringBuilder" )
  Dim sWord
  For Each sWord In aInp
      Dim dtCmp : dtCmp = CDate(sWord) ' depends on regional/locale settings
      oSB.AppendFormat_3 "{0:yyyy-MM}{1}{2}", dtCmp, csSep, sWord
      sWord = oSB.ToString()
      oSB.Length = 0
      oNAL.Add sWord
  Next
  oNAL.Sort

  ReDim aOut(oNAL.Count - 1)
  Dim i
  For i = 0 To UBound(aOut)
      aOut(i) = Split(oNAL(i), csSep)(1)
  Next
  WScript.Echo "B:", vbCrLf & Join(aOut, vbCrLf)

输出:

A:
Apr. 2013
May. 2013
Apr. 2014
Feb. 2013
Apr. 2011
Mar. 2013
Jul. 2013
Aug. 2013
---------------------
B:
Apr. 2011
Feb. 2013
Mar. 2013
Apr. 2013
May. 2013
Jul. 2013
Aug. 2013
Apr. 2014

理论是 (c) R. L. Schwartz(参见 Schwartzian transform)。

更新玛莎的回答(以及我的警告):

不必太相信 VBScript 的日期转换:

>> WScript.Echo CDate("Dez 2013")
>>
Error Number:       13  ' <-- can't read german
Error Description:  Type mismatch

>> WScript.Echo CDate("Dec 2013") ' <-- can read english
>>
01.12.2013 ' <-- can write german

>> WScript.Echo DateValue("Dez 2013")
>>
Error Number:       13 ' <-- DateValue isn't more intelligent
Error Description:  Type mismatch

【讨论】:

  • 我承认我从来没有用过英语以外的任何语言的 VBScript。
【解决方案2】:

DateValue() 函数在识别日期方面非常聪明,无论日期格式多么疯狂。将“2013 年 4 月”识别为 2013 年 4 月 1 日当然没有问题。因此,在您的排序例程中,不要比较键,而是比较它们的 DateValues。

【讨论】:

    【解决方案3】:

    我会用相应的公式替换每个键:

    newKey = year * monthRank
    

    monthRank 将是一月的 1,二月的 2,依此类推。然后可以使用newKey 对每个值进行排序。当然,这意味着您必须解析旧密钥才能识别 monthRankyear,但是将数据从非结构化数据格式转换为结构化数据格式需要您支付成本。

    希望我能帮上忙!

    【讨论】:

      猜你喜欢
      • 2016-03-04
      • 2014-10-01
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-16
      相关资源
      最近更新 更多