首先,我想对未显示任何代码表示抱歉,但现在我需要一些有关如何提取字符串的唯一ID的准则。
因此,我在如何组织数据方面存在一些问题。可以说,数据是经过组织的,以便每个dataID都有其唯一的名称。我将数据收集到一个保存它的数组中。
我现在遇到的问题是我想要一种简单的方法来搜索这些nameID
。想象一下,数据要大得多,并且包含数百个nameID的不同唯一组合。因此,我认为搜索id本身并不合适,并且我正在考虑创建一个哈希,可以使用算法搜索数组。我想这样做,因为稍后我将比较名称并将值添加到相应的nameID中。请记住,nameID
在大多数情况下将具有相同的结构,但是最终可以实现一个像total_air
这样的新名称,然后我需要在数组中进行搜索以获得正确的值。
已更新:
从excel收集数据的代码示例:
For Each targetSheet In wb.Worksheets
With targetSheet
'Populate the array
xData(0) = Application.Transpose(Range(Cells(1, 1), Cells(1, 1).End(xlDown)).Value2)
cnt = UBound(xData(0))
End With
Call dData.init(cnt)
'Populate the objectarray
dData.setNameArray = xData(0)
Next targetSheet
类型对象:
Private index As Integer
Private id As String
Private nameID() As Variant
Private data() As Variant
Private cnt As Integer
Public Sub init(value As Integer)
index = 0
cnt = value
id = ""
ReDim nameID(0 To cnt)
ReDim data(0 To cnt)
End Sub
Property Let setID(value As String)
id = value
End Property
Property Let setNameArray(value As Variant)
nameID = value
End Property
继承了dataStruct的dList:
Private xArray() As dataStruct
Private listInd As Integer
Public Sub init(cnt As Integer)
ReDim xArray(1 To cnt)
Dim num As Integer
For num = 1 To cnt
Set xArray(num) = New dataStruct
Next
listInd = 1
End Sub
Property Let addArray(value As dataStruct)
Set xArray(listInd) = value
listInd = listInd + 1
End Property
孔列表如何显示:
答案 0 :(得分:1)
我强烈建议使用字典。查找项目不仅更快(我认为它是通过某种哈希实现的),而且在添加或删除项目时具有很大的优势。
当您有一个数组并要添加一个项目时,要么总是必须使用确实昂贵的redim preserve
,要么您定义的数组要比最初需要的大,并且必须始终保持信息多少个项目真的很用而且从数组中删除项目相当复杂。
不能将类型化的变量作为项值添加到字典中,但是可以添加对象。因此,不用创建Type
定义,而是创建一个仅包含这些行的简单class
模块(当然,您可以创建带有属性,getter和setter的类,但这与该示例无关)
Public id As Long
Public name As String
Public value As Long
然后,处理字典非常简单(请注意,您必须添加对 Microsoft Scripting Runtime
的引用Option Explicit
Dim myList As New Dictionary
Sub AddItemValues(id As Long, name As String, value As Long)
Dim item As New clsMyData
With item
.id = id
.name = name
.value = value
End With
Call AddItem(item)
End Sub
Sub AddItem(item As clsMyData)
If myList.Exists(item.id) Then
set myList(item.id) = item
Else
Call myList.Add(item.id, item)
End If
End Sub
Function SearchItem(id As Long) As clsMyData
If myList.Exists(id) Then
Set SearchItem = myList(id)
Else
Set SearchItem = Nothing
End If
End Function
Function SearchName(name As String) As clsMyData
Dim item As Variant
For Each item In myList.Items
If item.name = name Then
Set SearchName = item
Exit Function
End If
Next item
Set SearchName = Nothing
End Function
只要您处理Id,字典就会为您完成所有工作。仅当您搜索name
时,您才需要遍历字典的所有项目,就像遍历数组一样简单。
一些测试(当然,您应该添加一些错误处理)
Sub test()
Call AddItemValues(32, "input_air", 0)
Call AddItemValues(45, "air_Procent", 99)
Call AddItemValues(89, "output_air", 34)
Debug.Print SearchItem(45).name
Debug.Print SearchName("output_air").value
' Change value of output_air
Call AddItemValues(89, "output_air", 1234)
Debug.Print SearchName("output_air").value
End Sub