文档章节

让自己的列表类支持遍历

涂孟超
 涂孟超
发布于 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
08/21
0
0
ArrayList工作原理

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

kukudeku
2016/08/26
137
0
Java集合框架面试题

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

火力全開
2016/10/09
19
0
40个Java集合面试问题和答案

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

天蚕宝衣
2016/03/31
39
0

没有更多内容

加载失败,请刷新页面

加载更多

存储过程知识点收集

记录下,以后要常用的问题 1、获取刚刚插入数据产生的ID SCOPE_IDENTITY 返回当前作用域的插入后产生的一条ID @@IDENTITY 返回当前表的最后一条ID

轻轻的往前走
4分钟前
0
0
elixir keyword和map的区别

┌──────────────┬────────────┬───────────────────────┐ │ Keyword List │ Map/Struct │ HashDict (deprec...

wmzsonic
7分钟前
0
0
解决bootstrap-table-fixed-columns.js显示列与隐藏列按钮切换表格不对齐

<table class="table-striped table-hasthead nowrap" id="tableTest1" data-search="true" data-show-columns="true" data-fixed-columns="true" data-fixed-number="3"></table> 含有dat......

tianyawhl
9分钟前
0
0
ES6 系列之 defineProperty 与 proxy

摘要: ## 前言 我们或多或少都听过“数据绑定”这个词,“数据绑定”的关键在于监听数据的变化,可是对于这样一个对象:`var obj = {value: 1}`,我们该怎么知道 obj 发生了改变呢? ## def...

阿里云官方博客
14分钟前
0
0
美团点评携手 PingCAP 开启新一代数据库深度实践之旅

一、背景和现状 在美团,基于 MySQL 构建的传统关系型数据库服务已经难于支撑公司业务的爆发式增长,促使我们去探索更合理的数据存储方案和实践新的运维方式。随着近一两年来分布式数据库大放...

TiDB
15分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部