1)先将3个listview排序 2)用 While 语句 i 变量对 ListView1 进行循环 a) 循环删除 ListView1、ListView2 各自第 i 个项目较小的一个,一直到两个项目相同 b) 循环删除 ListView1、ListView3 各自第 i 个项目较小的一个,一直到两个项目相同 c) i = i+1 3)删除 ListView2、ListView3 比 ListView1 项目个数多的部分(即大于 ListView1 最大项目的部分)
我5楼的方法考虑不周,改进一下: 2)用 While 语句 i 变量对 ListView1 进行循环 如果 ListView1、ListView2、ListView3 的第 i 个项目相同 i = i+1 否则 在(ListView1、ListView2、ListView3 的第 i 个项目)中只保留最大的,其他删除
写数组肯定是不对的,写数组要遍历3个ListView,另外当数据过多的时候内存消耗过巨'如果index也相同,只有一次遍历 for i = 1 to Lvw1.ListItem.Count if lvw2(i) == lvw1(i) and lvw3(i) == lvw1(i) then else delete lvw1(i) lvw2(i) lvw(3) end if next 'index不同 '除了遍历以外,没想到有什么办法
Option Explicit'比较两个项目,返回 -1:<, 0:=, 1:> Private Function CompareItem(ByVal item1 As ListItem, ByVal item2 As ListItem) As Integer '这里简单地用了字符串比较,可以用其他规则进行比较 CompareItem = StrComp(item1.Text, item2.Text) End FunctionPrivate Function Min(ByVal v1 As Long, ByVal v2 As Long, ByVal v3 As Long) As Long Dim v As Long v = IIf(v1 <= v2, v1, v2) Min = IIf(v <= v3, v, v3) End FunctionPrivate Sub Command1_Click() '保证3个ListView已排序
Dim list1 As ListItems, list2 As ListItems, list3 As ListItems Dim i As Long Set list1 = ListView1.ListItems Set list2 = ListView3.ListItems Set list3 = ListView2.ListItems
i = 1 While (i <= list1.Count) And (i <= list2.Count) And (i <= list3.Count) Select Case CompareItem(list1(i), list2(i)) Case -1 list1.Remove i
Select Case CompareItem(list2(i), list3(i)) Case -1 list2.Remove i Case 0
Case 1 list3.Remove i End Select Case 0 Select Case CompareItem(list1(i), list3(i)) Case -1 list1.Remove i list2.Remove i Case 0 i = i + 1 Case 1 list3.Remove i End Select Case 1 list2.Remove i
Select Case CompareItem(list1(i), list3(i)) Case -1 list1.Remove i Case 0
Case 1 list3.Remove i End Select End Select Wend
i = Min(list1.Count, list2.Count, list3.Count) While list1.Count > i list1.Remove list1.Count Wend While list2.Count > i list2.Remove list2.Count Wend While list3.Count > i list3.Remove list3.Count Wend End Sub
2)用 While 语句 i 变量对 ListView1 进行循环
a) 循环删除 ListView1、ListView2 各自第 i 个项目较小的一个,一直到两个项目相同
b) 循环删除 ListView1、ListView3 各自第 i 个项目较小的一个,一直到两个项目相同
c) i = i+1
3)删除 ListView2、ListView3 比 ListView1 项目个数多的部分(即大于 ListView1 最大项目的部分)
如 A=B=C 这样的ABC数组比较方法
2)用 While 语句 i 变量对 ListView1 进行循环
如果 ListView1、ListView2、ListView3 的第 i 个项目相同
i = i+1
否则
在(ListView1、ListView2、ListView3 的第 i 个项目)中只保留最大的,其他删除
只有一遍遍历。
for i = 1 to Lvw1.ListItem.Count
if lvw2(i) == lvw1(i) and lvw3(i) == lvw1(i) then
else
delete lvw1(i) lvw2(i) lvw(3)
end if
next
'index不同
'除了遍历以外,没想到有什么办法
1)ListView 可能存在多列,判断相同可能需要多个值比较,用数组存储不见得方便
2)关键是找到的相同项不是用来输出,而是用来保留 ListView 的内容。如果不直接操作 ListView 就需要记录哪些项目该删除、哪些要保留,不见得方便。
Private Function CompareItem(ByVal item1 As ListItem, ByVal item2 As ListItem) As Integer
'这里简单地用了字符串比较,可以用其他规则进行比较
CompareItem = StrComp(item1.Text, item2.Text)
End FunctionPrivate Function Min(ByVal v1 As Long, ByVal v2 As Long, ByVal v3 As Long) As Long
Dim v As Long
v = IIf(v1 <= v2, v1, v2)
Min = IIf(v <= v3, v, v3)
End FunctionPrivate Sub Command1_Click()
'保证3个ListView已排序
Dim list1 As ListItems, list2 As ListItems, list3 As ListItems
Dim i As Long
Set list1 = ListView1.ListItems
Set list2 = ListView3.ListItems
Set list3 = ListView2.ListItems
i = 1
While (i <= list1.Count) And (i <= list2.Count) And (i <= list3.Count)
Select Case CompareItem(list1(i), list2(i))
Case -1
list1.Remove i
Select Case CompareItem(list2(i), list3(i))
Case -1
list2.Remove i
Case 0
Case 1
list3.Remove i
End Select
Case 0
Select Case CompareItem(list1(i), list3(i))
Case -1
list1.Remove i
list2.Remove i
Case 0
i = i + 1
Case 1
list3.Remove i
End Select
Case 1
list2.Remove i
Select Case CompareItem(list1(i), list3(i))
Case -1
list1.Remove i
Case 0
Case 1
list3.Remove i
End Select
End Select
Wend
i = Min(list1.Count, list2.Count, list3.Count)
While list1.Count > i
list1.Remove list1.Count
Wend
While list2.Count > i
list2.Remove list2.Count
Wend
While list3.Count > i
list3.Remove list3.Count
Wend
End Sub