如何快速将重复的字符串列表处理成不重复的?(100分)

  • 主题发起人 主题发起人 cyradg
  • 开始时间 开始时间
C

cyradg

Unregistered / Unconfirmed
GUEST, unregistred user!
一个TStrings,里面包含可能重复的字符串,如何将它们变成不重复的,例如如何将:
a,b,c,a,a,a(1),a(2)变成:
a,b,c,a(3),a(4),a(1),a(2),即希望在重复的字符串后面加上“(N)”,N为数字,我要求的是快速,普通的写法对于大列表是非常慢的,谢谢。
 
indexof不就是一个个去查找吗,如果有1万个,那就是1万乘以1万遍的计算量。
 
在其中加入内容之前就设置Duplicated为ignore。
 
将重复的字符所在的位置编号作为其后面的“N”。
 
请问谁能写一段代码?谢谢,在重复字符所在位置做编号是不可靠的,例如:a,a,a(1),写成a,a(1),a(1)还是有a(1)是重复的,而不是a了,四楼的朋友,我不要加内容,而是把已经重复的内容修改为不重复的内容。
 
前提条件:定义为 TStringList,还要允许 Sort 重新排序
1.Sort 排一下序,IndexOf 还是要用的,
2.为了减少 IndexOf 查找的数据量,对数据进行分类处理
就是把:a,a,a,a(1),a(2) 存入到一个临时 TStringList 中,然后再进行重新编号。
3.如果不会存在 a,a,a,a(1),a(9) 这种不连号,或者允许完全重新编号为
a(1),a(2),a(3),a(4),a(5)
那么 IndexOf 也可以不用了,效率可以提高很多
 
如果用字符串处理的方法,可能确实很慢,你这个数组本身没有排序的,但是先排序,再逐个找到每个字母后面括号中的最大值,再依次排下次添加,应该写一个好的算法,应该很困难。

不过借用数据库不知道行不行?
把你的这个数组放到数据库里,然后用几个Select Like Max Min Order by,应该可以很快搞定。

不好意思,似乎非常的投机,希望看到更好的解决方案。
 
最好把 内容和序号分开。
 
最后我想还是采用lvzhu18的方法吧,1、先排序(升序),2、依次将a,a,a(1),a(N) (N为数字)之类的字符作为相同字符,以第一个a为相对位置,重新标号,这样只要轮两遍(包括排序),谢谢大家。
 
后退
顶部