【问题标题】:vba How to Bubble Sort with two Criteriavba 如何使用两个标准进行冒泡排序
【发布时间】:2017-03-13 10:06:21
【问题描述】:

我有一个这样的 txt 数组:

  • “唯一文本|05||001|”
  • “唯一文本|04||001|”
  • “唯一文本|05||002|”
  • “唯一文本|04||002|”
  • "唯一文本|05||003|"
  • "唯一文本|08||003|"
  • “唯一文本|04||003|”
  • “唯一文本|05||004|”

我已经设法用冒泡排序对这个数组进行排序,选择第二组数字“001,001,002,002,003....”但我也想用第一组数字进行排序。结果如下:

  • “唯一文本|04||001|”
  • “唯一文本|05||001|”
  • “唯一文本|04||002|”
  • “唯一文本|05||002|”
  • “唯一文本|04||003|”
  • "唯一文本|05||003|"
  • "唯一文本|08||003|"
  • “唯一文本|05||004|”

知道如何构建冒泡排序吗? 我需要在我的常规冒泡排序中使用新的 For 循环吗?

当前代码(这将仅根据第二组数字进行排序)。 104 = 最后一组数字的位置

    For i = 1 To UbndCellDataExcel - 1
      For j = i + 1 To UbndCellDataExcel
        If Mid(CellDataExcel(i), 104, 3) > Mid(CellDataExcel(j), 104, 3) Then   
            strTemp = CellDataExcel(i)
            CellDataExcel(i) = CellDataExcel(j)
            CellDataExcel(j) = strTemp
        End If
      Next j
    Next i

【问题讨论】:

  • 一种方法是在比较中使用 2 个字段的串联
  • 你能告诉我们你的代码吗?你在问什么听起来很微不足道。您只需将第一组数字的比较添加到条件中,以判断一行是否小于另一行。类似于 (RowA.Col2 > RowB.Col2 AND RowA.Col1 > RowB.Col1)

标签: arrays vba sorting bubble-sort


【解决方案1】:

解决的关键是比较功能:

有两种主要方法可以做到这一点: 第一个也是最简单的是 - 创建一个新数字并按它排序

convert "Unique text |05||001|" to "00105"
convert "Unique text |04||002|" to "00204"
00204>00105 so "Unique text |04||002|" > "Unique text |05||001|"

更正确但也更复杂的做法是简单地进行 2 次比较:

Function compare (ByVal i As String,ByVal j As String)
    i1=getParam(1,i)
    i2=getParam(2,i)
    j1=getParam(1,j)
    j1=getParam(2,j)
    if (i1>j1) return 1
    if (i2<j2) return -1
    if (j1>j1) return 1
    if (j2<j2) return -1
    return 0

其中getParam 是采用“唯一文本|04||002|”的函数并返回“04”或“002”。

【讨论】:

    【解决方案2】:

    谢谢你 מתן ל !这是我现在根据您的转换想法实现的:

    convert "Unique text |05||001|" to "00105"
    convert "Unique text |04||002|" to "00204"
    

    我的代码现在看起来像这样(100 = 第一组数字的位置,104 是第二组数字):

        For i = 1 To UbndCellDataExcel - 1
        For j = i + 1 To UbndCellDataExcel
            If Mid(CellDataExcel(i), 104, 3) & Mid(CellDataExcel(i), 100, 2) > Mid(CellDataExcel(j), 104, 3) & Mid(CellDataExcel(j), 100, 2) Then   'Sorter basert på OUnr
                strTemp = CellDataExcel(i)
                CellDataExcel(i) = CellDataExcel(j)
                CellDataExcel(j) = strTemp
            End If
        Next j
    Next i
    
    
    'Mid(CellDataExcel(i), 104, 3) & Mid(CellDataExcel(i), 100, 2) returns Format: "00105"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-31
      • 2014-03-14
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 2019-05-10
      • 2017-09-27
      • 1970-01-01
      相关资源
      最近更新 更多