`
hiphunter921
  • 浏览: 68338 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Flex中的Vector

阅读更多
今天在一个concrete example 中看到了:var unseenEmails:Vector.<EmailHeader> = new   Vector.<EmailHeader>();这样的写法,突然眼前一亮,貌似和java中的generics很像,于是特地google了一下Vector这个类,并找到如下说明,特此记录一笔。
http://www.adobechinadeveloper.com/Newsletter/articles/FlashVector.html 写道
创建一个VECTOR实例

Vector对象是一个有序数组,它仅存储一个类的值。一个特殊的Vector对象存储类被认为是Vector的基本类型。你可以在声明 Vector对象是指明基本类型,也可以当你创建Vecotr对象调用构造函数时指明。正如你所期望的,对一个Vector变量指明的积累比较与调用构造函数时指明的基类一致。

当创建一个Vector实例时,为了明确它的基类型,你需要添加额外的信息到Vector类名上,使用一种类型参数的语法。例如,下面的句子声明了一个名为myVector的Vector变量,使用类型参数语法来明确Vector存储在myVector中仅能包含String值


var myVector:Vector.<String>;

当你使用Vector类的构造函数创建对象是也可以使用同样的语法:

myVector = new Vector.<String>();

做为一个规则,当类名Vector出现在你的代码中时,通常会有类型参数一起使用。
当然,你可以在一行代码中组合声明变量和构造函数实例;

var myVector:Vector.<String> = new Vector.<String>();

尽管在这篇快速入门中所给的示例都比较简单,例如创建String和Number作为Vector的基类型,实际上,Vector类的基类型可以是任何类。这也包括你定义的自定义类。例如,假设你的代码定义了一个名为MyClass的类。在这种情况下,下面的代码是有效的,它将创建一个 Vector对象,它的元素都必须是MyClass实例:

var v:Vector.<MyClass> = new Vector.<MyClass>();

预先定义Vector的长度


Vector类构造函数有两个可选参数,它允许你明确你的Vector实例的数量。第一个参数是length参数。默认情况下,当一个Vector被创建时,它是空的(它有0个元素)。然而,如果你传递一个值给length参数,明确元素数量的Vector实例就被创建了:

var myVector:Vector.<String> = new Vector.<String>(7); // myVector is created with 7 elements


预先确定Vector的大小比一次创建一个元素效率要高,所以,如果你提前知道Vector包含有多少元素,提供一个length参数值是比较好的。如果 Vector的基类型是一个Boolean或者一个数值类型(Number,int,uint),每个元素都会被赋予这个数据类型的默认值 (Boolean的默认值false,数据类型默认值0)。否则,每个元素初始值为null。
创建一个可动态调整长度的Vector


Vector对象的另一个特征就是他们可以调整长度,这意味着你可以改变值,但是不能通过添加或删除元素来改变总数。默认地,一个Vector实例是不允许动态修改长度的。要创建一个可修改长度的Vector,将Vector类构造函数的第二个参数(fixed参数)设置为 true:

var myVector:Vector.<String> = new Vector.<String>(7, true); // myVector's length is fixed to 7 elements

[b]注意:[/b][i]你可以在任何时候修改Vector对象的fixed属性来设置Vector的长度是否可变。[/i]

myVector.fixed = false; // myVector's length is no longer fixed

添加值到Vector对象中


除了一个额外的限制之外,添加一个值到Vector对象中与添加一个值到Array对象中类似。一个Vector对象的每个元素必须有一个值(或者 null)。换句话说,你不能在一个序号为4的位置添加一个值,除非Vector的1-3为已经有值了。在实际中,这意味着要添加一个新的元素到 Vector中,你必须在等于Vector对象长度的序号位置添加它。(因为Vector的第一个元素序号为0,所以length属性的值通常比 Vector最后一个元素的序号要大。)下面的代码演示了这一技巧:

var names:Vector.<String> = new Vector.<String>();
// ... assume some elements are added ...

// Add an element to the end of the Vector
names[names.length] = "Bob";

除了使用array访问符([])操作添加一个值到Vector对象中外,你也可以使用Vector对象的push()或者 unshift()方法来添加元素到Vector中。就像Array类一样,push()方法创建了一个新元素在Vector最后一个元素的末尾,unshift()方法创建了一个新元素在Vector序号为0的位置(同时将所有已经存在的元素移位值高一位的位置):

names.push("Harold"); // adds the value "Harold" to the end of the Vector
names.unshift("Fred"); // adds the value "Fred" to the start of the Vector

这些方法还有额外的优势是,你可以传递多个值做为参数给方法,所有的值都会一次性添加到Vector对象中。然后,这种弹性的方式也会导致一个后果。当你使用push()或者unshift()方法添加值到Vector对象时,编译器不能检查数据类型是否匹配。因为,任何使用push() 或者unshift()添加错误类型的值到Vector对象中的代码知道运行代码时才会被发现。
从Vector对象中恢复值


从Vector对象中恢复值与从一个Array对象中恢复值完全一样。要从特定序号位置回复元素值,你需要使用数组访问符([])操作来明确你需要的元素序号:

var name1:String = names[0];

使用数组访问符([])操作恢复值,但是不会将它从Vector对象中移除。要恢复值并且将它从Vector对象中移除,请使用pop()方法(它会移除最后的一个元素)或者shift()方法(它会移除第0个元素,并且所有元素减一位):

var finalName:String = names.pop(); // removes the last value from the Vector
var firstName:String = names.shift(); // removes the first value from the Vector


将一个Vector的值进行排序

大部分使用Vector对象的方法与使用Array对象的方法都一样。有一个方法你需要知道的不一样的是在Vector对象元素排序。Vector类仅有一个方法给值排序:sort()方法。sort()方法不会更改原始的Vector对象。取而代之,它返回具有相同基类型包含已排序了值的一个新的 Vector。
当你使用Vector类的sort()方法时,它没有默认的排序行为,即使是基本的数据类型如Number或者String。正因为如此,任何时候你使用 sort()方法,你都需要指明一个自定义的排序函数来定义排序逻辑。例如,下面的代码中,一个Number类型的Vector对象使用sort()方法来排序。在这个案例中,这个代码演示了基本的数据排序;小的数字放在大的数字前面(升序排列)。名为sortNumbers()的函数定义了排序行为,它做为一个参数传递给了sort()方法调用。Flash Player给每个数字排序时,它调用sortNumber()函数,将要进行比较的两个数值传递给函数,结果决定最终排序的顺序:

var numberVector:Vector.<Number> = new Vector.<Number>();
numberVector.push(2, 17, 3.6, 4.4, 29, -34, 0.09235);

trace(numberVector); // output: 2,17,3.6,4.4,29,-34,0.09235

var sortedVector:Vector.<Number> = numberVector.sort(sortNumbers);

trace(sortedVector); // output: -34,0.09235,2,3.6,4.4,17,29

function sortNumbers(x:Number, y:Number):Number
{
if (x < y)
{
return -1;
}
else if (x > y)
{
return 1;
}
else
{
return 0;
}
}


你可以定义为任意数据类型定义一个排序函数。例如,下面的代码为Vector的Person对象根据姓(last name)进行了排序,然后名(first name)(它假定了有一个Person类具有firstName和lastName属性):

var personVector:Vector.<Person> = new Vector.<Person>();
personVector[0] = new Person("Bob", "Smith");
personVector[1] = new Person("Harold", "Johnson");
personVector[2] = new Person("Barbara", "Smith");
personVector[3] = new Person("Arnold", "Anderson");
personVector[4] = new Person("Margaret", "Wooster");

output:[Smith,Bob],[Johnson,Harold],[Smith,Barbara],[Anderson,Arnold],[Wooster,Margaret]
trace(personVector);

var sortedVector:Vector.<Person> = personVector.sort(sortPeople);

// output:[Anderson,Arnold],[Johnson,Harold],[Smith,Barbara],[Smith,Bob],[Wooster,Margaret]
trace(sortedVector);

function sortPeople(x:Person, y:Person):Number
{
// sort by last name
var lastNameSort:Number = sortStrings(x.lastName, y.lastName);

if (lastNameSort?!= 0)
{
return lastNameSort;
}
else
{
// if the last names are identical, sort by first name
return sortStrings(x.firstName, y.firstName);
}
}

function sortStrings(x:String, y:String):Number
{
if (x < y)
{
return -1;
}
else if (x > y)
{
return 1;
}
else
{
return 0;
}
}
}
分享到:
评论

相关推荐

    flex自定义多级系统菜单

    在Flex中,我们可以利用其强大的组件库来构建用户界面,其中包括创建自定义多级系统菜单的功能。这个“flex自定义多级系统菜单”的话题,主要是关于如何在Flex中通过XML配置实现动态、多层次的菜单结构。 在Flex中...

    Flex基础编程实例

    在Flex中,有固定大小数组(Array)和动态数组(Vector)两种。数组的元素可以是任何类型,而Vector则需要指定元素类型,提供更好的类型检查和性能。类型转换是将变量从一种类型转换为另一种类型的过程,如Number到...

    Flex3中文帮助---学习好帮手

    8. **图形渲染**:Flex使用Vector图形,可以呈现高质量、高分辨率的图形,同时支持位图图像,使得创建丰富的视觉效果成为可能。 9. **服务连接**:Flex可以与各种后台服务进行通信,包括AMF(Action Message Format...

    flex_array.rar_flex

    在这种情况下,动态数组或可扩展数组(如C++中的`std::vector`)应运而生。在您提供的资料中,“flex_array”似乎是一个自定义的动态数组实现,它具有灵活调整大小的能力,适用于那些需要在运行时改变数组容量的场景...

    Flex help之Flex 皮肤

    3. **导出为SWF或SVG**:将设计导出为SWF(Shockwave Flash)或SVG(Scalable Vector Graphics)格式,以便在Flex项目中使用。 4. **创建皮肤组件**:在Flex项目中,使用MXML或ActionScript编写皮肤类。导入导出的...

    flex datagrid 前台 分页

    Flex DataGrid是一款强大的数据展示组件,常用于Adobe Flex或Flash Builder等开发环境中。它能够高效地展示大量数据,并提供丰富的用户交互功能。在本场景中,我们关注的是“前台分页”这一技术。 前台分页是指在...

    flex旋转3D

    在本文中,我们将深入探讨如何使用Adobe Flex实现3D物体的旋转效果,以及如何通过鼠标交互来控制这种旋转。Flex是一种强大的开发框架,主要用于构建富互联网应用程序(RIA),它允许开发者使用ActionScript 3和MXML...

    android获取网络状态Flex开发

    下面是一段示例代码,展示了如何在Flex应用中检查WiFi和移动数据的连接状态: ```xml xmlns:s="library://ns.adobe.com/flex/spark" title="ConnectionTest" creationComplete="initView()"&gt; &lt;![CDATA[ ...

    flex 图片画线,拖动

    在IT行业中,尤其是在Web开发领域,"flex 图片画线,拖动"是一个常见的交互功能需求,用于增强用户体验。这个功能通常涉及到HTML5、CSS3和JavaScript等技术,特别是Flex布局和SVG图形技术。让我们详细探讨一下这个...

    Flex实现非空验证小例子

    在Flex应用中,数据验证是确保用户输入正确性的重要一环,特别是在处理表单提交时。非空验证则是验证中最基本的规则,确保用户必须填写某些字段,避免因为空值导致的错误或异常。 本例子提供了在Flex中实现非空验证...

    flex air 代码运行 exe 、bat

    在本篇文章中,我们将深入探讨如何使用Flex与Adobe AIR技术来执行本地的exe与bat文件。根据提供的文件信息,文章标题“flex air 代码运行 exe 、bat”以及描述部分都明确指出了这一主题的核心——利用Flex程序启动...

    vt.zip_flex

    标题中的"vt.zip_flex"可能是一个压缩包文件,其中包含与“flex”相关的资源或代码。"Flex"通常指的是Adobe Flex,一个用于构建富互联网应用程序(RIA)的开源框架,它基于ActionScript和MXML语言,允许开发人员创建...

    flex实现的TIN算法

    在Flex中,可以使用Array或Vector类存储这些数据,并确保它们按照特定的格式进行组织。 2. **构建邻接表**:为了快速找到相邻的点,需要构建一个邻接表。每个点都与它的邻居建立连接,这样可以在三角化过程中快速...

    flex4 cookbook4

    在《Flex4 Cookbook》这本书中,作者Joshua Noble、Todd Anderson、Garth Braithwaite、Marco Casario 和 Rich Tretola 共同探讨了Adobe Flex 4框架及其相关的ActionScript编程语言的基本概念和技术细节。...

    flex写的射击游戏

    这个射击游戏就是使用Flex技术开发的,展示了Flex在游戏开发中的应用,特别是面向对象编程的思想。 1. Flex基础:Flex提供了MXML和ActionScript两种语言来构建用户界面和应用程序逻辑。MXML是一种声明式语言,主要...

    flex完全自学手册-- 电子教案 PPT

    - **Event model**: Flex中的事件处理机制,通过addEventListener和removeEventListener来监听和处理事件。 7. **数据管理** - **XML和JSON**: 两种常用的数据格式,常用于Flex中的数据交换。 - **Collections**...

    flex的air环境下获取本机ip地址

    在Flex的AIR(Adobe Integrated Runtime)环境中,获取本机IP地址和MAC地址是常见的需求之一,尤其是在开发网络应用时。本文将详细介绍如何在AIR环境下利用Flex SDK中的`flash.net.NetworkInfo`类来实现这一功能。 ...

    flex制作的MP3播放器

    在这个场景中,我们讨论的是一个使用Flex技术制作的MP3播放器。 在Flex中开发MP3播放器,首先需要理解Flex的基本架构和编程模型。Flex应用程序基于ActionScript 3.0,这是一种面向对象的脚本语言,与Flash Player或...

    flex 消 除 锯 齿

    在前端开发中,"flex消除锯齿"是一个关于使用Flexbox布局来优化界面显示,特别是处理元素边缘在不同设备或浏览器上可能出现的像素不平滑现象的问题。Flexbox,全称为Flexible Box,是CSS3中的一种布局模式,设计用于...

Global site tag (gtag.js) - Google Analytics