VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
楼主: yunshenxin

文本删除重复算法问题~~高手请指点下

[复制链接]

0

主题

34

帖子

21.00

积分

新手上路

Rank: 1

积分
21.00
发表于 2020-3-29 10:45:01 | 显示全部楼层
20161217,D,B,DKDDA332021,ESA3332SS1
20161217,D,B,DKDDA332022,ESA3332SS2
20161217,D,B,DKDDA332023,ESA3332SS3
20161217,D,B,DKDDA332021,ESA3332SS2
20161217,D,B,DKDDA332025,ESA3332SS2
20161217,D,B,DKDDA332021,ESA3332SS3
20161217,D,B,DKDDA332022,ESA3332SS7

大哥唉,你看一下,DKDDA332021全删干净,是因为在第二次根据S5判断时,有重复的唉,很不幸唉你好好看一下.
如果要优化这个算法,很复杂了唉
回复

使用道具 举报

0

主题

34

帖子

21.00

积分

新手上路

Rank: 1

积分
21.00
发表于 2020-3-29 16:15:01 | 显示全部楼层
清理完S4,是这样的结果:
20161217,D,B,DKDDA332021,ESA3332SS3
20161217,D,B,DKDDA332022,ESA3332SS7
20161217,D,B,DKDDA332023,ESA3332SS3
20161217,D,B,DKDDA332025,ESA3332SS2
然后,很不幸,20161217,D,B,DKDDA332021,ESA3332SS3这行,因为ESA3332SS3与它行有重复,所以被搞掉了
回复

使用道具 举报

0

主题

25

帖子

18.00

积分

新手上路

Rank: 1

积分
18.00
发表于 2020-3-29 20:45:01 | 显示全部楼层
function CompareS4(Item1, Item2: Pointer): Integer;
begin
  Result := CompareText(TStrings(Item1)[3], TStringList(Item2)[3]);
end;

function CompareS5(Item1, Item2: Pointer): Integer;
begin
  Result := CompareText(TStrings(Item1)[4], TStringList(Item2)[4]);
end;

procedure TFormDemo.ButtonRemoveClick(Sender: TObject);
var
  StringsList: TList;
  Strings: TStrings;
  TmpStrings: TStrings;
  Idx: Integer;
begin
  if OpenDialog.Execute then
  begin
    Memo.Lines.LoadFromFile(OpenDialog.FileName);

    //把数据写入到List
    StringsList := TList.Create;
    for Idx := 0 to Pred(Memo.Lines.Count) do
    begin
      Strings := TStringList.Create;
      Strings.Delimiter := ',';
      Strings.DelimitedText := Memo.Lines[Idx];
      StringsList.Add(Pointer(Strings));
    end;

    TmpStrings := TStringList.Create;

    //删除S4相同的行
    StringsList.Sort(CompareS4); //按S4排序
    TmpStrings.Assign(TStrings(StringsList.Items[Pred(StringsList.Count)]));
    for Idx := Pred(StringsList.Count-1) downto  0 do
    begin
      if TmpStrings[3] = TStrings(StringsList.Items[Idx])[3] then
        StringsList.Delete(Idx)
      else
        TmpStrings.Assign(TStrings(StringsList.Items[Idx]));
    end;

    //删除S5相同的行
    StringsList.Sort(CompareS5); //按S5排序
    TmpStrings.Assign(TStrings(StringsList.Items[Pred(StringsList.Count)]));
    for Idx := Pred(StringsList.Count-1) downto  0 do
    begin
      if TmpStrings[4] = TStrings(StringsList.Items[Idx])[4] then
        StringsList.Delete(Idx)
      else
        TmpStrings.Assign(TStrings(StringsList.Items[Idx]));
    end;

    //把数据回写到MEMO
    Memo.Clear;
    for Idx := 0 to Pred(StringsList.Count) do
    begin
      Memo.Lines.Add(TStrings(StringsList.Items[Idx]).DelimitedText);
    end;

    //把数据回写到文档
    Memo.Lines.SaveToFile(OpenDialog.FileName);
  end;
end;
回复

使用道具 举报

4

主题

19

帖子

17.00

积分

新手上路

Rank: 1

积分
17.00
 楼主| 发表于 2020-3-29 21:45:01 | 显示全部楼层
天哪,晴空霹雳~ 很感谢你哦~你的算法,很好哦~~已经满足我的要求了~~非常感谢哦~~
回复

使用道具 举报

0

主题

34

帖子

21.00

积分

新手上路

Rank: 1

积分
21.00
发表于 2020-3-29 23:30:01 | 显示全部楼层
嘎嘎~~ 谢谢夸奖唉
回复

使用道具 举报

4

主题

19

帖子

17.00

积分

新手上路

Rank: 1

积分
17.00
 楼主| 发表于 2020-3-30 10:30:02 | 显示全部楼层
这么多人帮助,真的很谢谢大家~`感动~
回复

使用道具 举报

4

主题

19

帖子

17.00

积分

新手上路

Rank: 1

积分
17.00
 楼主| 发表于 2020-3-30 20:45:01 | 显示全部楼层
supperman 运行你的程序时,会越界哦~你看看
回复

使用道具 举报

0

主题

25

帖子

18.00

积分

新手上路

Rank: 1

积分
18.00
发表于 2020-3-31 03:15:02 | 显示全部楼层
supperman 运行你的程序时,会越界哦~你看看
========================
不会越界的。
回复

使用道具 举报

0

主题

25

帖子

18.00

积分

新手上路

Rank: 1

积分
18.00
发表于 2020-3-31 11:45:01 | 显示全部楼层
运算结果
======
20161217,D,B,DKDDA332021,ESA3332SS1
20161217,D,B,DKDDA332022,ESA3332SS2
20161217,D,B,DKDDA332023,ESA3332SS3
回复

使用道具 举报

4

主题

19

帖子

17.00

积分

新手上路

Rank: 1

积分
17.00
 楼主| 发表于 2020-3-31 20:00:02 | 显示全部楼层
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,StrUtils;

type
  TForm1 = class(TForm)
    Button1: TButton;
    OpenDialog: TOpenDialog;
    Memo: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
function CompareS4(Item1, Item2: Pointer): Integer;
begin
  Result := CompareText(TStrings(Item1)[3], TStringList(Item2)[3]);
end;

function CompareS5(Item1, Item2: Pointer): Integer;
begin
  Result := CompareText(TStrings(Item1)[4], TStringList(Item2)[4]);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  StringsList: TList;
  Strings: TStrings;
  TmpStrings: TStrings;
  Idx: Integer;
begin
  if OpenDialog.Execute then
  begin
    Memo.Lines.LoadFromFile(OpenDialog.FileName);

    //把数据写入到List
    StringsList := TList.Create;
    for Idx := 0 to Pred(Memo.Lines.Count) do
    begin
      Strings := TStringList.Create;
      Strings.Delimiter := ',';
      Strings.DelimitedText := Memo.Lines[Idx];
      StringsList.Add(Pointer(Strings));
    end;

    TmpStrings := TStringList.Create;

    //删除S4相同的行
    StringsList.Sort(CompareS4); //按S4排序
    TmpStrings.Assign(TStrings(StringsList.Items[Pred(StringsList.Count)]));
    for Idx := Pred(StringsList.Count-1) downto  0 do
    begin
      if TmpStrings[3] = TStrings(StringsList.Items[Idx])[3] then
        StringsList.Delete(Idx)
      else
        TmpStrings.Assign(TStrings(StringsList.Items[Idx]));
    end;

    //删除S5相同的行
    StringsList.Sort(CompareS5); //按S5排序
    TmpStrings.Assign(TStrings(StringsList.Items[Pred(StringsList.Count)]));
    for Idx := Pred(StringsList.Count-1) downto  0 do
    begin
      if TmpStrings[4] = TStrings(StringsList.Items[Idx])[4] then
        StringsList.Delete(Idx)
      else
        TmpStrings.Assign(TStrings(StringsList.Items[Idx]));
    end;

    //把数据回写到MEMO
    Memo.Clear;
    for Idx := 0 to Pred(StringsList.Count) do
    begin
      Memo.Lines.Add(TStrings(StringsList.Items[Idx]).DelimitedText);
    end;

    //把数据回写到文档
    Memo.Lines.SaveToFile(OpenDialog.FileName);
  end;
end;




end.


出错提示 http://www.kongqiqiu.com/down/text.jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表