文档章节

让自己的列表类支持遍历

涂孟超
 涂孟超
发布于 2014/09/26 15:35
字数 439
阅读 4
收藏 0

一个普通的数字列表类(TNumList), 还没有支持遍历:

unit NumList;

interface

uses SysUtils;

type
  TNumList = class
  private
    FCount: Integer;
    FNumArray: array of Double;
    function GetNum(aIndex: Integer): Double;
    procedure SetNum(aIndex: Integer; aNum: Double);
  public
    constructor Create(aCount: Integer);
    property Count: Integer read FCount;
    property Nums[Index: Integer]: Double read GetNum write SetNum; default;
  end;

implementation

{ TNumList }

constructor TNumList.Create(aCount: Integer);
begin
  inherited Create;
  FCount := aCount;
  SetLength(FNumArray, FCount);
end;

function TNumList.GetNum(aIndex: Integer): Double;
begin
  if (aIndex < 0) or (aIndex >= FCount) then raise Exception.Create('索引越界');
  Result := FNumArray[aIndex];
end;

procedure TNumList.SetNum(aIndex: Integer; aNum: Double);
begin
  if aIndex >= FCount then
  begin
    FCount := aIndex + 1;
    SetLength(FNumArray, FCount);
  end;
  FNumArray[aIndex] := aNum;
end;

end. //end

//调用测试:
uses NumList;

procedure TForm1.Button1Click(Sender: TObject);
var
  nList: TNumList;
  i: Integer;
begin
  nList := TNumList.Create(5);
  for i := 0 to nList.Count - 1 do //赋值
  begin
    nList[i] := Random(1000) / 100;
  end;

  Memo1.Clear;
  for i := 0 to nList.Count - 1 do //取值
  begin
    Memo1.Lines.Add(FloatToStr(nList[i]));
  end;
  nList.Free;
end;


支持遍历的 TNumList 类:

unit NumList;

interface

uses SysUtils;

type
  TNumList = class;

  TNumEnumerator = class
  private
    FIndex: Integer;
    FNumList: TNumList;
  public
    constructor Create(aNumList: TNumList);
    function GetCurrent: Double;
    function MoveNext: Boolean;
    property Current: Double read GetCurrent;
  end;

  TNumList = class
  private
    FCount: Integer;
    FNumArray: array of Double;
    function GetNum(aIndex: Integer): Double;
    procedure SetNum(aIndex: Integer; aNum: Double);
  public
    constructor Create(aCount: Integer);
    function GetEnumerator: TNumEnumerator; //!
    property Count: Integer read FCount;
    property Nums[Index: Integer]: Double read GetNum write SetNum; default;
  end;

implementation

{ TNumList }

constructor TNumList.Create(aCount: Integer);
begin
  inherited Create;
  FCount := aCount;
  SetLength(FNumArray, FCount);
end;

function TNumList.GetEnumerator: TNumEnumerator;
begin
  Result := TNumEnumerator.Create(Self);
end;

function TNumList.GetNum(aIndex: Integer): Double;
begin
  if (aIndex < 0) or (aIndex >= FCount) then raise Exception.Create('索引越界'');
  Result := FNumArray[aIndex];
end;

procedure TNumList.SetNum(aIndex: Integer; aNum: Double);
begin
  if aIndex >= FCount then
  begin
    FCount := aIndex + 1;
    SetLength(FNumArray, FCount);
  end;
  FNumArray[aIndex] := aNum;
end;

{ TNumEnumerator }

constructor TNumEnumerator.Create(aNumList: TNumList);
begin
  inherited Create;
  FIndex := -1;
  FNumList := aNumList;
end;

function TNumEnumerator.GetCurrent: Double;
begin
  Result := FNumList[FIndex];
end;

function TNumEnumerator.MoveNext: Boolean;
begin
  Result := FIndex < FNumList.Count - 1;
  if Result then Inc(FIndex);
end;

end. //end

//调用测试
uses NumList;

procedure TForm1.Button1Click(Sender: TObject);
var
  nList: TNumList;
  i: Integer;
  num: Double;
begin
  nList := TNumList.Create(5);
  for i := 0 to nList.Count - 1 do //赋值
  begin
    nList[i] := Random(1000) / 100;
  end;

  Memo1.Clear;

  for num in nList do //遍历
  begin
    Memo1.Lines.Add(FloatToStr(num));
  end;

  nList.Free;
end;

本文转载自:http://www.cnblogs.com/del/archive/2011/05/09/2041064.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
Java 常用工具类 Collections 源码分析

文章出处 文章出自:安卓进阶学习指南 作者:shixinzhang 完稿日期:2017.10.25 和 是 JDK 为我们提供的常用工具类,方便我们操作集合和数组。 这次之所以总结这个,是因为在一次面试中被问到...

u011240877
2017/10/26
0
0
面试必备:30个Java集合面试问题及答案

Java集合框架为Java编程语言的基础,也是Java面试中很重要的一个知识点。这里,我列出了一些关于Java集合的重要问题和答案。 1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中...

jamesese
2018/08/21
0
0
40个Java集合面试问题和答案

1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、HashTable和Array。随着集合的广泛使 用,Java1.2提出了囊括所有集...

赵小宾
2015/05/12
0
0
ArrayList工作原理

1.前言 List接口中,重要的两个实现是ArrayList和LinkedList,其中ArrayList又比LinkedList常用。这是因为ArrayList的读取性能远远高于LinkedList。本篇博文将介绍ArrayList,稍后介绍Linke...

kukudeku
2016/08/26
137
0
40个Java集合类面试题和答案

Java集合框架为Java编程语言的基础,也是Java面试中很重要的一个知识点。这里,我列出了一些关于Java集合的重要问题和答案。 1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中...

jamesese
2018/10/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Navicat使用教程:使用Navicat Premium 12自动执行数据库复制(二)

下载Navicat Premium最新版本 Navicat Premium是一个可连接多种数据库的管理工具,它可以让你以单一程序同时连接到MySQL、Oracle及PostgreSQL数据库,让管理不同类型的数据库更加的方便。 与...

电池盒
21分钟前
1
0
简单聊聊Linux学习经历

学习,是我们一生中都规避不了的一个话题,人的一生中都是在不断的学习,无论是功成名就的人士,还是一无是处的小混混,始终都处在一个不断学习的环境中,只是学习的内容千差万别,有的人是为...

linux-tao
21分钟前
1
0
如何才能从程序员成长为实战型架构师?必掌握这7大实战技能经验

想成为一名架构师,但是架构师对应的技能,我应该掌握哪些啊?以及掌握的程度是什么样的?如何成为一名真正的实战性架构师? 我简要分为以下7点来谈谈,从技能的角度抛砖引玉,希望你对你架构...

mikechen优知
33分钟前
2
0
vue里实现echarts中国地图

echartsDemo.vue <template> <div> <div id="chart_example"></div> </div></template><script> // 首先要 cnpm install echarts import echarts from 'echarts' import ......

Danni3
44分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部