求助vb] 保留问题

adodc1 2008-11-27 08:44:02
怎样三个listview之间的相同内容保留下来呢
要求考虑运行效率使用函数方法。
...全文
106 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2008-11-27
  • 打赏
  • 举报
回复
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 Function

Private 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 Function

Private 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
Tiger_Zhao 2008-11-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 adodc1 的回复:]
还要考虑运行效率,ListView1、ListView2、ListView3的数据存储到数组里,然后,用循环或函数方法比较过程。

直接ListView1、ListView2、ListView3循环比较不太明智了
[/Quote]
不见得
1)ListView 可能存在多列,判断相同可能需要多个值比较,用数组存储不见得方便
2)关键是找到的相同项不是用来输出,而是用来保留 ListView 的内容。如果不直接操作 ListView 就需要记录哪些项目该删除、哪些要保留,不见得方便。
adodc1 2008-11-27
  • 打赏
  • 举报
回复
还是不明白
神马都能聊 2008-11-27
  • 打赏
  • 举报
回复
写数组肯定是不对的,写数组要遍历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不同
'除了遍历以外,没想到有什么办法
adodc1 2008-11-27
  • 打赏
  • 举报
回复
还要考虑运行效率,ListView1、ListView2、ListView3的数据存储到数组里,然后,用循环或函数方法比较过程。

直接ListView1、ListView2、ListView3循环比较不太明智了
Tiger_Zhao 2008-11-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 adodc1 的回复:]
各个对对比较回是不是要多次操作呢, 我要一次完成此操作
[/Quote]
每次比较要么保留3个相同项、要么至少删除一个小项,最多比较次数为3个listview的项目数之和。
只有一遍遍历。
Tiger_Zhao 2008-11-27
  • 打赏
  • 举报
回复
我5楼的方法考虑不周,改进一下:
2)用 While 语句 i 变量对 ListView1 进行循环
如果 ListView1、ListView2、ListView3 的第 i 个项目相同
i = i+1
否则
在(ListView1、ListView2、ListView3 的第 i 个项目)中只保留最大的,其他删除
adodc1 2008-11-27
  • 打赏
  • 举报
回复
有没有listviw1,listview2,listiew3的数据传输到相应数组里,然后,循环比较各个数据里的相同数据呢
如 A=B=C 这样的ABC数组比较方法
adodc1 2008-11-27
  • 打赏
  • 举报
回复
各个对对比较回是不是要多次操作呢, 我要一次完成此操作
Tiger_Zhao 2008-11-27
  • 打赏
  • 举报
回复
1)先将3个listview排序
2)用 While 语句 i 变量对 ListView1 进行循环
a) 循环删除 ListView1、ListView2 各自第 i 个项目较小的一个,一直到两个项目相同
b) 循环删除 ListView1、ListView3 各自第 i 个项目较小的一个,一直到两个项目相同
c) i = i+1
3)删除 ListView2、ListView3 比 ListView1 项目个数多的部分(即大于 ListView1 最大项目的部分)
6742 2008-11-27
  • 打赏
  • 举报
回复
用循环语句进行,但还是不太明白说的是什么问题
aohan 2008-11-27
  • 打赏
  • 举报
回复
不懂你说的是什么意思?


adodc1 2008-11-27
  • 打赏
  • 举报
回复
相同内容保留在新的listview里
莫情莫钱 2008-11-27
  • 打赏
  • 举报
回复
保留在新的listview中??

7,789

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧