社区首页 >问答首页 >在Delphi中删除TStringList中的重复行而不进行排序

在Delphi中删除TStringList中的重复行而不进行排序
EN

Stack Overflow用户
提问于 2017-12-14 08:47:45
回答 3查看 2.6K关注 0票数 7

我知道如何使用排序的Tstringlist列表的dupignore从中删除重复的字符串。

代码语言:javascript
代码运行次数:0
复制
CallData := TStringList.Create;
CallData.Sorted := True;
Call.Duplicates := dupIgnore;

,但在我的例子中,字符串不能被排序,

当indexOF有数十万行时,使用FOR循环查找重复非常慢(也使用TStringList ())。

代码语言:javascript
代码运行次数:0
复制
 if OpenDialog1.Execute then
  begin
    Try
      y := TStringList.create;
      f := TStreamReader.create(OpenDialog1.FileName, TEncoding.UTF8, True);
      while not f.EndOfStream do
      begin
        l := f.ReadLine;
        X.Add(l);
      end;

      g := Tstreamwriter.create('d:\logX.txt', True, TEncoding.UTF8);
      for I := 0 to X.count - 1 do
      begin


          if y.IndexOf(X[I]) = -1 then

          y.Add(X[I]);

      end;

      for j := 0 to y.count - 1 do
        g.WriteLine(y[j]);

    Finally
      f.free;
      y.free;
      g.free;
    End;
  end;

还有更好的办法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-14 09:06:02

下面是我如何处理这个问题的方法:

  1. 创建一个按字符串键键的字典。值类型是什么并不重要。
  2. 以相反的顺序遍历字符串列表。
  3. 对于每个字符串,检查它是否在字典中。
  4. 如果它在字典中,请从字符串列表中删除。否则将添加到字典中。

如果要删除大量重复项,则重复从字符串列表中删除将影响上述操作的性能。这是因为要删除的每一项都会导致后面的项向下移动一个索引。您可以通过复制到新列表而不是删除内嵌来避免这种情况。

或者,您也可以这样操作:

  1. 创建一个按字符串键键的字典。值类型是什么并不重要。
  2. 将名为Count的变量初始化为零。
  3. 按前向顺序遍历字符串列表。
  4. 对于每个字符串,检查它是否在字典中。
  5. 如果它在字典里,就什么也不做。否则,将添加到字典中,将其复制到列表的索引Count中,然后添加Count
  6. 迭代完成后,调整列表大小,使其具有Count元素。

字典的重点是查找是一个O(1)操作,因此第二个算法具有O(n)的时间复杂度。

票数 6
EN

Stack Overflow用户

发布于 2017-12-14 12:06:56

我会用诡计,有一个排序和一个未排序的列表。如下所示:

代码语言:javascript
代码运行次数:0
复制
  y := TStringList.create;
  s := TStringList.create;
  s.Sorted := TRUE;
  s.Duplicates := dupIgnore;

  f := TStreamReader.create(OpenDialog1.FileName, TEncoding.UTF8, True);
  while not f.EndOfStream do
  begin
    l := f.ReadLine;
    s.Add(l);
    if s.Count > y.Count then y.Add(l);
  end;

  // etc.
票数 2
EN

Stack Overflow用户

发布于 2017-12-14 14:04:17

代码语言:javascript
代码运行次数:0
复制
function compareobjects
          (list     : Tstringlist;
           index1   : integer;
           index2   : integer
          )         : integer;
begin
  if index1 = index2 then
    result := 0
  else
    if integer(list.objects[index1]) < integer(list.objects[index2]) then
      result := -1
    else
      result := 1;
end;

begin
  Try
    y := TStringList.create;
    y.Sorted := true;
    y.Duplicates := dupignore;
    f := TStreamReader.create('c:\106x\q47780823.bat');
    i := 0;
    while not f.EndOfStream do
    begin
      inc(i);
      line := f.readline;
      y.Addobject(line,tobject(i));
    end;
    y.Sorted := false;
    y.CustomSort(compareobjects);

    for i := 0 to y.count - 1 do
      WriteLn(y[i]);

    Finally
      f.free;
      y.free;
  End;
  readln;
end.

我会跟踪行号(i),并将其与字符串一起赋值,方法是将其转换为对象;对列表进行排序并一如既往地删除重复项,然后使用对象上的自定义排序对其进行取消排序。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47818390

复制
相关文章
Linux 删除文本中的重复行
这里我做了个简单的测试,当file中的重复行不再一起的时候,uniq将服务删除所有的重复行。经过排序后,所有相同的行都在相邻,因此unqi可以正常删除重复行。
阳光岛主
2019/02/19
8.6K0
[Leetcode][python]删除排序数组中的重复项/删除排序数组中的重复项 II
数组完成排序后,我们可以放置两个指针 ii 和 jj,其中 ii 是慢指针,而 jj 是快指针。只要 nums[i] = nums[j]nums[i]=nums[j],我们就增加 jj 以跳过重复项。
蛮三刀酱
2019/03/26
6.5K0
[Leetcode][python]删除排序链表中的重复元素/删除排序链表中的重复元素 II
如果当前节点有后一个节点,且它们的值相等,那么当前节点指向后一个节点的下一个节点,这样就可以去掉重复的节点。
蛮三刀酱
2019/03/26
2.8K0
删除排序数组中的重复项
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
_kyle
2020/11/03
4.5K0
<leetcode刷题-数组>删除排序数组中的重复项
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
哆哆jarvis
2022/08/23
4.3K0
删除排序链表中的重复元素
题意 给定一个排序链表,删除所有重复的元素每个元素只留下一个。 样例 给出 1->1->2->null,返回 1->2->null 给出 1->1->2->3->3->null,返回 1->2->3->null 思路 设置一个指针指向排序链表的头结点,遍历链表,若当前元素与下一个元素相同,直接将下一个元素的 next 指向下下个即可。 代码实现 /** * Definition for ListNode * public class ListNode { * int val; * L
一份执着✘
2018/06/04
1.5K0
删除排序数组中的重复项
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
木瓜煲鸡脚
2020/09/23
5K0
[随缘一题]删除排序链表中的重复元素
如果当前节点的值和下一节点的值相等,则跳过下一个节点.即将当前节点的next指针指向下一个节点的指针.
呼延十
2019/07/01
1.5K0
[leetcode数组系列]3 删除排序数组中的重复项
1 leetcode原文链接 https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/ 示例1
我是程序员小贱
2020/06/05
4.2K0
删除排序数组中的重复数字Ⅱ
题意 根据 删除排序数组中的重复数字 中的题意,跟进 ”删除重复数字“,如果可以允许出现两次重复将如何处理? 样例 给出数组 A = [1,1,2,2,2,3],你的函数应该返回长度 5,此时 A = [1,1,2,2,3]。 思路 这道题跟 删除排序数组中的重复数字 差不多,无非就是多判断一次,判断是否有两个连续的重复元素即可。 代码实现 public class Solution { /** * @param A: a array of integers * @return
一份执着✘
2018/06/04
1.2K0
删除排序链表中重复元素的方法
链表的操作非常常见,也是面试中经常会被问道的问题。对于链表重复元素的删除,有两个变体,现在总结如下。 链表代码如下:
冬天里的懒猫
2020/08/03
1K0
LeetCode - 删除排序数组中的重复项
LeetCode第26题,难度简单。这题题目也是相当的长,所以只取了题目的主干,示例和说明请点击下方链接查看详情。
晓痴
2019/08/22
4K0
LeetCode - 删除排序数组中的重复项
删除排序数组中的重复数字
题意 给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度。 不要使用额外的数组空间,必须在原地没有额外空间的条件下完成。 样例 给出数组nums =[5,6,8,9,9,10],你的函数应该返回长度5,此时nums = [5,6,8,9,10]。 思路 用 2 个指针,一个指有效元素的长度,一个从前向后扫,跳过重复的元素,将不重复的元素依次放到数组前方,最后返回有效元素的长度即可。 代码实现 public class Solution { /**
一份执着✘
2018/06/04
1.3K0
[LEETCODE]从排序数组中删除重复项
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
用户2353021
2020/05/11
6.3K0
如何用 awk 删除文件中的重复行【Programming】
了解如何在不排序或更改其顺序的情况下使用awk'!visited $ 0 ++'。
Potato
2019/11/09
8.7K0
如何用 awk 删除文件中的重复行【Programming】
112. 删除排序链表中的重复元素比较删除
给定一个排序链表,删除所有重复的元素每个元素只留下一个。 样例 给出 1->1->2->null,返回 1->2->null 给出 1->1->2->3->3->null,返回 1->2->3->null
和蔼的zhxing
2018/09/04
7790
算法-删除已排序数组中的重复项
版权声明: https://blog.csdn.net/li_xunhuan/article/details/89843311
Fisherman渔夫
2019/07/31
3.5K0
Leetcode之删除排序数组中的重复项
每个数组的长度都是大于等于1的,遍历数组,如果遇到不同的就加一,这里尽量不用len函数
润森
2019/11/05
3.3K0
LintCode 删除排序链表中的重复元素题目
题目 给定一个排序链表,删除所有重复的元素每个元素只留下一个。 样例 给出 1->1->2->null,返回 1->2->null 给出 1->1->2->3->3->null,返回 1->2->3->null /** * Definition for ListNode * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; *
desperate633
2018/08/22
6180
leetcode:83 删除排序链表中的重复元素
问题? 如果next没有值的话,会报错的。 因为要相等啊,比较啊,有值才能比较是吧。 那为什么p.next=p.next.next;如果p.next.next;没有值为什么不会报错?因为他不是比较。比较必须是值与值比较的啊。 所以
贵哥的编程之路
2020/10/28
5340
leetcode:83 删除排序链表中的重复元素

相似问题

删除重复行而不排序

82

如何删除vi中不连续的重复行而不进行排序?

11

删除文件中的重复行而不进行排序。

12

删除vi中连续的重复行而不排序

63

如何使TStringList在Delphi中进行不同的排序

36
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文