kenlistian

勤学多思

  IT博客 :: 首页 :: 新随笔 ::  :: 聚合  :: 管理 ::
  412 随笔 :: 0 文章 :: 23 评论 :: 0 Trackbacks

#

j2me 笔记一

废话少说,自我的总结,标注笔记要纲。也算是自我学习j2me,做做笔记吧。

学习材料来自:http://www.j2medev.com/Article/Class1/Class11/200506/278.html

1.1   J2ME

J2ME是SUN公司针对嵌入式、消费类电子产品推出的开发平台,
与J2SE和J2EE共同组成Java技术的三个重要的分支。

J2ME实际上是一系列规范的集合,由JCP组织制定相关的Java Specification Request(JSR)并发布,
各个厂商会按照规范在自己的产品上进行实现,但是必须要通过TCK测试,这样确保兼容性。


1.2    J2ME平台体系结构

  J2ME平台由配置(Configuration)和简表(Profile)构成的。
  
  配置是提供给最大范围设备使用的最小类库集合,在配置中同时包含Java虚拟机。
  简表是针对一系列设备提供的开发包集合。
  
  可选包(Optional Package),它是针对特定设备提供的类库,

  如某些设备是支持蓝牙的, 针对此功能J2ME中制定了JSR82(Bluetooth API)提供了对蓝牙的支持。

  J2ME中有两个最主要的配置,
  a.Connected Limited Devices Configuration(CLDC)
  b.Connected Devices Configuration(CDC)。

  CLDC主要针对那些资源非常受限的设备比如手机、PDA、双工寻呼机等。
  CDC主要面对那些家电产品,比如机顶盒、汽车导航系统等。

  简表是以配置为基础的,
  Mobile Information Devices Profile(MIDP)就是CLDC上层的重要简表。

1.3    MIDlet 程序模型
   MIDP中定义了一种新的应用程序模型MIDlet。
   被Application Management Software(AMS)管理的。

   AMS负责MIDlet的安装、下载、运行和删除等操作。
   MIDlet向AMS通信通知应用管理软件自己状态的变化,
   MIDlet有三个状态,分别是pause、active和destroyed。
  
   用一张图很好表达了状态转换。
   
   
MiDlet的程序模型框架如下:
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class HelloWorld extends MIDlet{

   private Display display;

   //构造函数
   public HelloWorld(){

       display = Display.getDisplay(this);
       System.out.println("Constructor");

   }

   public void startApp(){

       System.out.println("startApp is called.");
       Form f = new Form("HelloTest");
       display.setCurrent(f);
   }

   public void pauseApp(){
       System.out.println("pauseApp is called.");
       }

   public void destroyApp(boolean unconditional){
       System.out.println("destroyApp is called.");
       }

}

编译该程序后运行,控制台上输出:Constructor startApp is called.
退出该程序时,控制台就会输出:   destroyApp is called.
posted @ 2008-06-17 19:40 kenlistian 阅读(355) | 评论 (0)编辑 收藏

     摘要: 这个是采用as3编程的flash例子。其中代码如下:由此例子可见,as3,和一般编程没有什么2样了,可以说未来,ria的编程也可基于as3.  1 2 3import fl.controls.*; 4import fl.data.DataProvider; 5 6/**//*  7 &n...  阅读全文
posted @ 2008-06-07 00:06 kenlistian 阅读(1871) | 评论 (0)编辑 收藏




as3中字符串的处理

1.length
2.charAt ,charCodeAt
3.比较字符串
4.toString
5.+ concat
6. toLowerCase() or toUpperCase()
7. 字符串查找
8  隔离字符串
9  查找,替换,匹配字符串。


length 属性   每个字符串都有 length 属性,其值等于字符串中的字符数:

var str:String = "Adobe";
trace(str.length);  



使用 charAt() 方法和 charCodeAt() 方法检查字符串各个位置上的字符:

var str:String = "hello world!";
for (var:i = 0; i < str.length; i++)
{
    trace(str.charAt(i), "-", str.charCodeAt(i));
}


比较字符串   <、<=、!=、==、=> 和 >。

获取其它对象的字符串表示形式,以toString() 方法来实现此目的。
var n:Number = 99.47;
var str:String = n.toString();
    // str == "99.47"


字符串连接的含义是:将两个字符串按顺序合并为一个字符串。
  用 + 运算符来连接两个字符串
  和 concat() 方法


在大小写之间转换字符串
 toLowerCase() 方法和 toUpperCase() 方法分别将字符串中的英文字母字符转换为小写和大写:


substr() 和 substring() 返回字符串的一个子字符串。

在这两个方法中,第一个参数是给定字符串中起始字符的位置。
在 substr() 方法中,第二个参数是要返回的子字符串的"长度",
在 substring() 方法中,第二个参数是子字符串的"结尾"处字符的位置(该字符不包含在返回的字符串中)。
如:
var str:String = "Hello from Paris, Texas!!!";
trace(str.substr(11,15)); // 输出:Paris, Texas!!!
trace(str.substring(11,15)); // 输出:Pari

slice() 方法的功能类似于 substring() 方法。但可以使用负整数作为参数,
此时字符位置将从字符串末尾开始向前算起,

var str:String = "Hello from Paris, Texas!!!";
trace(str.slice(11,15)); // 输出:Pari
trace(str.slice(-3,-1)); // 输出:!!
trace(str.slice(-3,26)); // 输出:!!!
trace(str.slice(-3,str.length)); // 输出:!!!
trace(str.slice(-8,-3)); // 输出:Texas

查找匹配子字符串的字符位置
indexOf() 和 lastIndexOf()在字符串内查找匹配的子字符串,

var str:String = "The moon, the stars, the sea, the land";
trace(str.indexOf("the")); //输出:10

var str:String = "The moon, the stars, the sea, the land"
trace(str.indexOf("the", 11)); // 输出:21

lastIndexOf() 方法在字符串中查找子字符串的最后一个匹配项:

var str:String = "The moon, the stars, the sea, the land"
trace(str.lastIndexOf("the")); // 输出:30

如为 lastIndexOf() 方法提供了第二个参数,搜索将从字符串中的该索引位置反向(从右到左)进行:

var str:String = "The moon, the stars, the sea, the land"
trace(str.lastIndexOf("the", 29)); // 输出:21


创建由分隔符分隔的子字符串数组
split() 方法创建子字符串数组,该数组根据分隔符进行划分。

var queryStr:String = "first=joe&last=cheng&title=manager&StartDate=3/6/65";
var params:Array = queryStr.split("&", 2); // params == ["first=joe","last=cheng"]

split() 方法的第二个参数是可选参数,该参数定义所返回数组的最大大小。

另 split还支持正则表达式作为分隔符处理,这里不涉及正则处理

在字符串中查找模式并替换子字符串
 match() 和 search() 方法可查找与模式相匹配的子字符串。
 replace() 方法可查找与模式相匹配的子字符串并使用指定子字符串替换它们。
 search() 方法返回与给定模式相匹配的第一个子字符串的索引位置。


var str:String = "The more the merrier.";
trace(str.search("the")); // 输出:9

对于search,match,replace都支持正则表达式匹配处理。




posted @ 2008-06-05 13:37 kenlistian 阅读(7215) | 评论 (0)编辑 收藏

2007年7月
  拉斯维加斯开幕的NAB展会上,微软正式发布了之前被誉为“Flash杀手”新跨平台网络媒体解决方案(之前的名称为WPF/E),将其定名为Silverlight。

开发中的WPF/E全称为Windows Presentation Foundation Everywhere,是微软新Windows图形子系统“Windows Presentation Foundation”(代号Avalon)的一个子集。WPF/E基于跨浏览器网络技术,依赖XAML语言和JavaScript脚本创建页面,与Flash一样作为浏览器插件工作,同样能显示矢量图形、动画和视频,可以运行在多种操作系统甚至移动设备上。

Silverlight相对于Flash的优势在于视频,未来我们可能将使用Silverlight轻松的在网页上观看高清视频内容。Silverlight使用WMV格式,支持从低分辨率的移动媒体到全屏HD视频,并支持VC-1编码。为此微软还专门同时发布了VC-1编码器SDK。Silverlight基于.NET Framework,更方便程序员进行开发,提供高速媒体编码、硬件加速、支持Windows Server “Longhorn”等特性。

微软将于本月底的MIX07展会上对Silverlight进行详细的介绍,并发布Silverlight Beta版本。支持Windows和Mac OS X系统,支持IE 6.0/7.0、Firefox 1.5.0.8/2.0、Safari等浏览器。






除了ajax,flash,新的富媒体平台诞生了!虽然目前对它还很陌生,但相信不久的将来它将会越来越多的出现大家的视野中。SilverLight ,名字也很不错!不知道微软是不是针对Adobe的Apollo。拭目以待!

SilverLight是微软即将推出的跨浏览器、跨平台的解决方案,主要有以下特点:
 1. 在Web上提供丰富的用户体验
  * 空前的富媒体体验以及网络应用
  * 强大的基于向量的图形
  * 无敌的从Mobile到HD质量的视频以及音频
  * 在有硬件加速支持下,最高达15倍的视频编码速度
  * 移动设备支持
 2. 快速,更具生产力的开发
  * 集成现有的网络开发技术及资源
  * Web以及桌面一致的表现层,保证了开发的低成本性
  * 基于标准的可验证的开发技术
  * 为开发人员以及设计人员提供了广泛的工具支持,并且建立了相应的开发设计生态圈
 3. 快速部署
  * 简单按需安装的SilverLight浏览器插件
  * 灵活的基于视频及动画的广告嵌入方案
  * 低成本的流媒体解决方案,基于荣获艾美奖荣誉的Windows Media技术
  * 内容访问保护技术
  * 在Microsoft Expression Media Encoder的支持下,加速编码并且发布基于视频的体验

silverlight官方网站:http://www.microsoft.com/s...
该文转载自新席地网:http://newxd.com/article.asp?id=719
posted @ 2008-06-04 16:26 kenlistian 阅读(312) | 评论 (0)编辑 收藏


关联数组

关联数组有时候也称为"哈希"或"映射",由键和键值组成。
关联数组是键和值对的无序集合。

在as3中引入了名为"字典"的高级关联数组。
字典是 flash.utils 包中 Dictionary 类的实例,使用的键可以为任意数据类型,
但通常为 Object 类的实例。即字典的键不局限于 String 类型的值。

故关联数组的键名分类有以下2种。

1.键名为字符串
   在 as3中有两种创建关联数组的方法。
  
  a.使用 Object 构造函数
     Object 类的实例(也称作"通用对象")在功能上等同于关联数组。
     通用对象的每个属性名称都用作键,提供对存储的值的访问。
     如:
     var monitorInfo:Object = {type:"Flat Panel", resolution:"1600 x 1200"};
     trace(monitorInfo["type"], monitorInfo["resolution"]);
     // 输出:Flat Panel 1600 x 1200


     如在声明数组时不需要初始化,则以[] or . 添加值。
     如:
      var monitorInfo:Object = new Object();
      monitorInfo["aspect ratio"] = "16:10";
      monitorInfo.colors = "16.7 million";
      trace(monitorInfo["aspect ratio"], monitorInfo.colors);
      // 输出:16:10 16.7 million

  b.用 Array 构造函数,如果将关联数组声明为 Array 类型,则将无法使用对象文本初始化该数组。

    var monitorInfo:Array = new Array();
    monitorInfo["type"] = "Flat Panel";
    monitorInfo["resolution"] = "1600 x 1200";
    trace(monitorInfo["type"], monitorInfo["resolution"]);
    // 输出: Flat Panel 1600 x 1200

    用 Array 构造函数创建关联数组没有什么优势。即使使用 Array 构造函数或 Array 数据类型,
    也不能将 Array 类的 Array.length 属性或任何方法用于关联数组。
    最好将 Array 构造函数用于创建索引数组。

    即不赞成用array做字典以及哈希组织数据。

2.键名为对象
用 Dictionary 类创建使用对象而非字符串作为键的关联数组。

如,考虑这样一个应用程序,它可根据 Sprite 对象与特定容器的关联确定 Sprite 对象的位置。
可以使用 Dictionary 对象,将每个 Sprite 对象映射到一个容器。

如下例子:

import flash.display.Sprite;
import flash.utils.Dictionary;

var groupMap:Dictionary = new Dictionary();

// 作为键名的对象
var spr1:Sprite = new Sprite();
var spr2:Sprite = new Sprite();
var spr3:Sprite = new Sprite();

// 用作值的对象
var groupA:Object = new Object();
var groupB:Object = new Object();

// 在字典中创建新的键-值对。
groupMap[spr1] = groupA;
groupMap[spr2] = groupB;
groupMap[spr3] = groupB;

if (groupMap[spr1] == groupA)
{
    trace("spr1 is in groupA");
}
if (groupMap[spr2] == groupB)
{
    trace("spr2 is in groupB");
}
if (groupMap[spr3] == groupB)
{
    trace("spr3 is in groupB");
}

posted @ 2008-06-04 11:04 kenlistian 阅读(1967) | 评论 (0)编辑 收藏

wxwidgets是一个 c++编写的用来提供gui开发的框架。它包含一个可以支持现今几乎所有操作系统
  (Version 2 currently supports all desktop versions of MS Windows, Unix with GTK+,
  Unix with Motif, and MacOS. An OS/2 port is in progress.)的GUI库和其他一些很有用的工具,
  提供了类似MFC的功能。而且,特别要说一下,这个c++lib还的新版本还提供了对掌上电脑的支持。
  当然,说到这里很多人会想到java队多系统的支持,其实这是不一样的,java的跨平台是建立在
  “中间代码”的基础上的,就是说需要在目标平台上安装java解释器;
  wxwidgets是c++库,经过编译后,他提供的是native级的机器码,

wxwidgets有什么特别之处呢?比起其他的跨平台gui库,有什么好处呢?

1、免费
    主体框架的授权协议支持商业免费应用,其外围功能库中很多也是lgpl授权的,

2、 他是跨平台的gui库,支持的操作系统很全面,甚至支持pda(说不定过一段时间他都能够支持symbian了)。

   此跨平台非彼跨平台,它虽然不像java那样是“全面”的,而仅仅是gui库,但是gui是计算机编程中,
    最为麻烦、耗费时间、容易出现bug的部分,特别当你想要自己的软件运行在多个操作系统上的时候,
    开发和维护的难度让人难以想象。
    其实c++也是支持“跨平台”的,因为c++可以在任何平台上编译运行,之所以没几个人说他是跨平台的,
    问题就出在变量长度和各操作系统的gui(这里的“界面”我指得是很广义的)上,如果解决了gui的问题,
    基本上就解决了c++的“跨平台”问题——至少不用为每种平台都维护一份源代码了。

3、 wxwidgets提供的gui是大量使用宏的,这就意味着它是在尽可能的使用目标系统native的gui样式。
   
4、 它支持的编译器也很多

5、 wxwidgets一直都在快速稳健的开发中,周边工具也越来越多。
 
    随着m$开始全力支持他的.net,c++成了“没落”的语言,但是不可否认,c++还是有很多用武之地的,
    所以根本不可能真正没落。没有了超牛X的支持,地球人自然开始寻求新的发展方式,wxwidgets这种开源
    免费,且允许商业应用的好东东,自然会被人们所重视。

posted @ 2008-06-03 14:27 kenlistian 阅读(721) | 评论 (0)编辑 收藏

  关注ruby中的GUI架构
 
   http://anvil.rubyforge.org/



Anvil是一个打算在Ruby开发跨平台GUI应用中大展宏图的MVC框架。
目前它需要WxRuby——WxWidgets这个流行的C++框架的Ruby绑定
——的支持,不过它的目标是成为一个与工具无关的抽象层(
如,它也把RubyCocoa和FxRuby作为了目标方向)。虽然这个
项目目前还正处于发展初期(当前的版本是0.0.1),但它已经
引起了Ruby社区的关注,它的DSL可能会使Ruby中的GUI开发如同
当前使用Rails和Merb框架开发Web应用一样简单。


2008年2月

posted @ 2008-06-03 14:19 kenlistian 阅读(473) | 评论 (0)编辑 收藏


看代码,学程序
1.hello 例子
require "wx"
include Wx  

=begin
 第一个参数nil,表示要构造的Frame是没有父窗口的,如果有的话,应该在这儿传送。
    第二个参数 -1,标识
    第三个参数 标题。"The Bare Minimum",
    第四个参数 定义了Frame在桌面上出现的位置.
    第五个参数 定义Frame的初始大小
    第六个参数,窗体类型。
=end
class MinimalApp < App 
   def on_init  
        myFrame = Frame.new(nil, -1, "test")    #创建frame
        StaticText.new(myFrame,-1,"Hello World")  
        myFrame.show()     #显示
  end 
end 

MinimalApp.new.main_loop 

然后通过exerb生成exe。单独可以运行。

2.创建一个确认对话框
require 'wx'
include Wx

class MyApp < Wx::App
  MENU_DIALOGS = 1000
  def on_init()
    frame = Wx::Frame.new(nil, -1, 'test123(ue)')

    #创建菜单子项
    menu_dialogs = Wx::Menu.new()  
    menu_dialogs.append(MENU_DIALOGS, "&Dialog...\t", 'Dialog')

    #创建菜单条
    menu_bar  = Wx::MenuBar.new()
    menu_bar.append(menu_dialogs, "&mytest")
    frame.set_menu_bar( menu_bar )

    frame.set_client_size( Wx::Size.new(200,200))
    frame.evt_menu(MENU_DIALOGS) {  | e |  on_dialog(e) }

    panel = Wx::Panel.new(frame)  
 frame.show()
  end


  DIALOG_OPTIONS = Wx::NO_DEFAULT|Wx::OK|Wx::CANCEL|Wx::ICON_EXCLAMATION
  def on_dialog(event)
    confirm = Wx::MessageDialog.new(nil, "Are you really sure?",
                                    "Just checking", DIALOG_OPTIONS )
    case confirm.show_modal()
    when Wx::ID_OK
      puts "OK"
    when Wx::ID_CANCEL
      puts "NOT OK"
    end
  end
end

MyApp.new.main_loop()

 


3.窗口框架中例子

require 'wx'
include Wx

#搜寻框
class SearchDialog < Wx::Dialog
  def initialize(parent)
    super( parent, -1, 'Search')

    sizer = Wx::FlexGridSizer.new(2,4)

    #创建lable
    sizer.add(Wx::StaticText.new(self, -1, 'Search for'), 0, Wx::ALIGN_CENTRE_VERTICAL|Wx::ALIGN_RIGHT, 4)
 #创建edit,其中edit为@term
    @term  = Wx::TextCtrl.new(self, -1, 'text')     
    sizer.add(@term, 2, Wx::GROW|Wx::ALL, 4)

 #创建lable
    sizer.add(Wx::StaticText.new(self, -1, 'Expand search'),0, Wx::ALIGN_CENTRE_VERTICAL|Wx::ALIGN_RIGHT, 4)

 #spin控件
 @expand = Wx::SpinCtrl.new( self, -1, "")
    @expand.set_range(0,250)
    @expand.set_value(50)
    sizer.add(@expand, 0, Wx::ALL, 4)

 #
    sizer.add(Wx::StaticText.new(self, -1, ''), 0, Wx::ALIGN_CENTRE, 4)
    @regx  = Wx::CheckBox.new(self, -1, "Use regular expressions")
    sizer.add(@regx, 0, Wx::ALL, 4)

    #search button和他响应事件
    button = Wx::Button.new(self, -1, 'Search')
    button.evt_button(button.get_id) { | e | on_do_search() }
    sizer.add(button, 0, Wx::ALL, 4)

    #cancel button
    button = Wx::Button.new(self, -1, 'Cancel')
    button.evt_button(button.get_id) { | e | hide() }
    sizer.add(button, 0, Wx::ALL|Wx::ALIGN_RIGHT, 4)
   
 #size 置入dialog框体中
    self.set_sizer(sizer)
    sizer.set_size_hints(self)
    sizer.fit(self)
  end

  def get_term
    @term.get_value
  end

  def get_regexp
    @regx.get_value
  end

  def get_expand
    @expand.get_value
  end

  def on_do_search
    puts "Search term: %s; regexps: %s; expand: %i" %
      [ get_term(), get_regexp(), get_expand() ]
  end
end


#主框架处理
class MyApp < Wx::App
  MENU_DIALOGS = 1000
  MENU_EXIT    = 1001
 
 
  def on_init()
    @frame = Wx::Frame.new(nil, -1, 'Dialog')
    menu_dialogs = Wx::Menu.new()
    menu_dialogs.append(MENU_DIALOGS, "&Dialog...\t", 'Dialog')
    menu_dialogs.append(MENU_EXIT, "&Exit...\t", 'Exit')
    menu_bar  = Wx::MenuBar.new()
    menu_bar.append(menu_dialogs, "&Dialogs")
   @frame.set_menu_bar( menu_bar )

    @frame.set_client_size( Wx::Size.new(400,400) )
    @frame.evt_menu(MENU_DIALOGS) { | e | on_dialog(e) }
    panel = Wx::Panel.new(@frame)
    @frame.show()

  end

  def on_dialog(event)
    @search ||= SearchDialog.new(@frame)
    @search.show(true)
  end


end

MyApp.new.main_loop()





posted @ 2008-06-03 11:30 kenlistian 阅读(1064) | 评论 (0)编辑 收藏


一创建数组
Array 构造函数的使用有三种方式。

1 空数组。用 Array 类的 length 属性来验证数组是否不包含元素。

    var names:Array = new Array();
    trace(names.length);   // 0

2. 初始化数组长度,其长度 0 和 4,294,967,295 之间的无符号整数。

var names:Array = new Array(3);
trace(names.length); // 输出:3
trace(names[0]);     // 输出:undefined
trace(names[1]);     // 输出:undefined
trace(names[2]);     // 输出:undefined

3.初始化构造。

var names:Array = new Array("John", "Jane", "David");
trace(names.length); // 输出:3
trace(names[0]);     // 输出:John
trace(names[1]);     // 输出:Jane
trace(names[2]);     // 输出:David

也可以创建具有数组文本或对象文本的数组。将数组文本直接分配给数组变量,如:

var names:Array = ["John", "Jane", "David"];


二插入数组元素方法:
 push()、unshift() 和 splice()
 
 push()    用于在数组末尾添加一个或多个元素。
 unshift() 用于在数组开头插入一个或多个元素,在索引号 0 处插入。
 splice()  用于在数组中的指定索引处插入任意数目的项目。

如:
var planets:Array = new Array();
planets.push("Mars");           // 数组内容:Mars
planets.unshift("Mercury");     // 数组内容:Mercury,Mars
planets.splice(1, 0, "Venus", "Earth");

     传递给 splice() 的第一个参数是整数 1,它用于指示从索引 1 处开始插入。
     传递给 splice() 的第二个参数是整数 0,它表示不应删除任何项。
     传递给 splice() 的第三和第四个参数 Venus 和 Earth 为要插入的项。

push() ,unshift() 方法均返回一个无符号整数,它们表示修改后的数组长度。
在用于插入元素时,splice() 方法返回空数组,
通过使用 splice() 方法,不仅可以将元素插入到数组中,而且还可以从数组中删除元素。
用于删除元素时,splice() 方法将返回包含被删除元素的数组。

三删除数组元素
 pop()、shift() 和 splice()
 
 pop() 方法用于从数组末尾删除一个元素。
 shift() 方法用于从数组开头删除一个元素,始终删除索引号 0 处的元素。
 splice() 方法既可用来插入元素,也可以删除任意数目的元素,其操作的起始位置位于由发送到此方法的第一个参数指定的索引号处。

如:
var oceans:Array = ["Victoria", "Pacific", "Aral", "Superior", "Indian", "Huron"];
oceans.splice(2, 2, "Arctic", "Atlantic"); // 替换 Aral 和 Superior,
oceans.pop();      // 删除 Huron
oceans.shift();    // 删除 Victoria


pop() 和 shift() 方法均返回已删除的项。由于数组可以包含任意数据类型的值,
splice() 方法将返回包含被删除值的数组。

var lakes:Array = oceans.splice(2, 2, "Arctic", "Atlantic");
trace(lakes); // 输出:Aral,Superior


delete 运算符用于将数组元素的值设置为 undefined,但它不会从数组中删除元素。长度不变。

var oceans:Array = ["Arctic", "Pacific", "Victoria", "Indian", "Atlantic"];
delete oceans[2];
trace(oceans);        // 输出:Arctic,Pacific,,Indian,Atlantic
trace(oceans[2]);     // 输出:undefined
trace(oceans.length); // 输出:5

数组的length具有截断功能,将数组的 length 属性设置为小于数组当前长度的值,
则会截断数组,索引号高于 length 的新值减 1 处所存储的任何元素将被删除。

如:

var oceans:Array = ["Arctic", "Pacific", "Victoria", "Aral", "Superior"];
oceans.length = 2;
trace(oceans); // 输出:Arctic,Pacific


四对数组排序
reverse()、sort() 和 sortOn()

reverse() 倒序排列
sort()    按照多种预定义的方式对数组进行排序,甚至可用来创建自定义排序算法。
sortOn() 方法可用来对对象的索引数组进行排序,这些对象具有一个或多个可用作排序键的公共属性。


sort() 方法按照"默认排序顺序"重新安排数组中的元素。默认排序顺序具有以下特征:

排序区分大小写,也就是说大写字符优先于小写字符。例如,字母 D 优先于字母 b。
排序按照升序进行,也就是说低位字符代码(例如 A)优先于高位字符代码(例如 B)。
排序将相同的值互邻放置,并且不区分顺序。
排序基于字符串,也就是说,在比较元素之前,先将其转换为字符串(例如,10 优先于 3,
            因为相对于字符串 "3" 而言,字符串 "1" 具有低位字符代码)。
     您也许需要不区分大小写或者按照降序对数组进行排序,或者您的数组中包含数字,
     从而需要按照数字顺序而非字母顺序进行排序。

sort() 方法具有 options 参数,可通过该参数改变默认排序顺序的各个特征。
       options 是由 Array 类中的一组静态常量定义的,如以下列表所示:

Array.CASEINSENSITIVE:此选项可使排序不区分大小写。例如,小写字母 b 优先于大写字母 D。
Array.DESCENDING:用于颠倒默认的升序排序。例如,字母 B 优先于字母 A。
Array.UNIQUESORT:如果发现两个相同的值,此选项将导致排序中止。
Array.NUMERIC:这会导致排序按照数字顺序进行,比方说 3 优先于 10。

如:

var poets:Array = ["Blake", "cummings", "Angelou", "Dante"];
poets.sort(); // 默认排序
trace(poets); // 输出:Angelou,Blake,Dante,cummings

poets.sort(Array.CASEINSENSITIVE);
trace(poets); // 输出:Angelou,Blake,cummings,Dante

poets.sort(Array.DESCENDING);
trace(poets); // 输出:cummings,Dante,Blake,Angelou

poets.sort(Array.DESCENDING | Array.CASEINSENSITIVE); // 使用两个选项
trace(poets); // 输出:Dante,cummings,Blake,Angelou


可以编写自定义排序函数,然后将其作为参数传递给 sort() 方法。

如,以下按第二个单词排序,而不是第一个单词排序

以下代码展示如何编写自定义排序函数,函数内部可以不理会。

var names:Array = new Array("John Q. Smith", "Jane Doe", "Mike Jones");

function orderLastName(a, b):int
{
    var lastName:RegExp = /\b\S+$/;
    var name1 = a.match(lastName);
    var name2 = b.match(lastName);
    if (name1 < name2)
    {
        return -1;
    }
    else if (name1 > name2)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
trace(names); // 输出:John Q. Smith,Jane Doe,Mike Jones
names.sort(orderLastName);
trace(names); // 输出:Jane Doe,Mike Jones,John Q. Smith

说明下:
自定义函数作为参数传入sort。其自定义参数必须有2个参数组成。
因为它每次对两个数组元素进行操作。排序函数的返回值指示应如何对元素排序:

返回值 -1 表示第一个参数 a 优先于第二个参数 b。
返回值 1 表示第二个参数 b 优先于第一个参数 a。
返回值为 0 表示元素具有相同的排序优先级。


sortOn() 方法是为对象数组而使用。
对象元素中应具有一个可用作排序键的公共属性。

如以下数组中的元素是由对象组成。
以下对象中以姓和年份组成。

var poets:Array = new Array();
poets.push({name:"Angelou", born:"1928"});
poets.push({name:"Blake", born:"1757"});
poets.push({name:"cummings", born:"1894"});
poets.push({name:"Dante", born:"1265"});
poets.push({name:"Wang", born:"701"});


使用 sortOn() 方法,按born 属性对数组进行排序。
sortOn() 带两个参数 fieldName 和 options。

如,使用两个参数 "born" 和 Array.NUMERIC 来调用 sortOn()。
Array.NUMERIC 参数用于确保按照数字顺序进行排序,

poets.sortOn("born", Array.NUMERIC);
for (var i:int = 0; i < poets.length; ++i)
{
    trace(poets[i].name, poets[i].born);
}
/* 输出:
Wang 701
Dante 1265
Blake 1757
cummings 1894
Angelou 1928
*/

 

当在sort() 和 sortOn()中使用
 Array.RETURNINDEXEDARRAY 常量作为 options 参数。
        会对数组排序而又不修改现有数组。

如:
var indices:Array;

//indices 为poets元素排序后的元素索引数组,
indices = poets.sortOn("born", Array.NUMERIC | Array.RETURNINDEXEDARRAY);

for (var i:int = 0; i < indices.length; ++i)
{
    var index:int = indices[i];
    trace(poets[index].name, poets[index].born);
}


五查询数组
concat()、join()、slice(),toString()

concat() 和 slice() 方法返回新数组
join() 和 toString() 方法返回字符串。

concat() 方法将新数组和元素列表作为参数,并将其与现有数组结合起来创建新数组。
slice() 方法具有两个名为 startIndex 和 endIndex 的参数,
        并返回被数组分离出来的元素数组。
        分离从 startIndex 处的元素开始,到 endIndex 处的前一个元素结束。


如:
var array1:Array = ["alpha", "beta"];
var array2:Array = array1.concat("gamma", "delta");
trace(array2);           // 输出:alpha,beta,gamma,delta

var array3:Array = array1.concat(array2);
trace(array3); // 输出:alpha,beta,alpha,beta,gamma,delta

var array4:Array = array3.slice(2,5);
trace(array4); // 输出:alpha,beta,gamma


join() 和 toString() 方法查询数组,并将其内容作为字符串返回。

join() 方法不带参数,则与toString同,返回所有元素的列表(以逗号分隔)的字符串。
join() 方法带参数;  即返回字符串以参数为分隔符

如:

var rivers:Array = ["Nile", "Amazon", "Yangtze", "Mississippi"];
var riverCSV:String = rivers.toString();
trace(riverCSV);      // 输出:Nile,Amazon,Yangtze,Mississippi
var riverPSV:String = rivers.join("+");
trace(riverPSV);      // 输出:Nile+Amazon+Yangtze+Mississippi


join() 方法中,如果数组中存在嵌套数组,则按默认方式处理,

var nested:Array = ["b","c","d"];     
var letters:Array = ["a",nested,"e"];
var joined:String = letters.join("+");
trace(joined); // 输出:a+b,c,d+e

 

posted @ 2008-06-03 09:09 kenlistian 阅读(2015) | 评论 (0)编辑 收藏

 

 


"Flex 跟Flash 的分别最大的就是在于组件吧。
Flex可以很方便的使用组件,但是不能随便改外观,这个是优点,但也是一定局限。
当然Flex也可以很方便实用,而且,外观设计也可以随便更改。为此,Flex为程序员
度身定做的,他不需要时间轴,也不用考虑外观问题,因为组件的外观已经确定,能
改的也只是颜色改变一下而已。但Flash CS3的IDE对于程序员来说,是很麻烦的事情,
但设计师却非常喜欢。

毕竟设计师跟程序员的工作内容不同。就我自己的感觉而言,Flex就好像没有设计界面
的Flash。Flex因为不能用IDE画图,所以,不能很个性化的创造界面(除非有新的组件
加入),但程序逻辑等编辑是很一流的。说穿了就是不用顾及外观,只要程序能有效率
的运行就可以了。但对于设计师来说,并不满足于功能实现,还要有好看的外观。

实际上,MXML能有效减少因为组织程序界面写的代码,运行逻辑的代码还是跟Flash一样的。
表达方式不一样,但结果还是一样。"

我自己比较喜欢Flash画图,更改程序外观,用FD来写代码(Flash 的代码IDE是在差劲)。
就这样,不用MXML,那代价就是要写一大段代码来组织程序界面的东东咯。。。。"


"Flash本来就是用来做设计的,而Flex是用来做RIA的"

"尽管flash与flex都是依托于flash player而运行和展示,
从商业角度看,flash是专注于视频设计,动画设计类,没有过多的业务逻辑成分;

flex专注于应用系统,专注于web应用,当然现在也有了桌面应用AIR,
flex是封装了一些flash组建供开发人员使用。

从as来看,flash中的AS用处最多的是他的事件机制,属于普通脚本范畴,
而flex中,AS还另外赋予了处理业务逻辑的使命,已经是一种面向对象的语言,
基本可以代替java之类的来处理业务逻辑,当然,他没有java那样的可以与n'多
服务交互,总的来说,flex中的AS既充当了脚本角色,还充当业务制定角色。"

 

"as3是开发语言(就象C#,java一样),
flex与Adobe Flash CS3是开发as3程序用到工具软件(就象Microsoft Visual Studio 2005和Jbuilder一样)。

至于,flex与Adobe Flash CS3为什么同时出现,我认为,是adob公司为了应付原有的flash软件用户才保留了
Adobe Flash CS3,而flex才是以后的主流开发软件~~
由于本人的大多数项目都是as2开发的,所在不太在意Adobe Flash CS3中components少的问题,建议去开源的
组件网站下载一个就行了"

 

"Flex是工具.as3是语言.
Flex就是Flex.另一个RIA开发技术.是通过编写代码来生成swf的,与使用Flash来制作swf不同. "

 

1.如果你指的flex是flex  builder的话,那它是一个RIA(Rich Internet Applications)
   ——富网络程序的IDE(集成开发环境)。
  

   "
 似乎Adobe已经推出了flex builder3。
    如果你指的flex是广义的技术的话,那用网上流传最多的话来说
    “它是Macromedia发布的presentation  server(展现服务),是java web  container或者.net server的一个应用,
    根据.mxml文件(纯粹的xml描述文件和actionscript)产生相应的.swf文件。”

  Flex和AS的关系大致是:
   
    flex是as与mxml以及其他杂七杂八的东西如js、html等等结合产生的一种互联网解决方案。
   
    哈哈,这么理解来,应该说as是flex的脚丫子,既是基础又靠它走路。

2.其实flex和AS应该都是MM公司(Macromedia,听起来好像是跟MicroSoft对着干的意思)搞出来的东西,
  只不过几年前MM被近来很嚣张的Adobe公司活捉之后才变成了它的东东。
  至于flex用什么那就不好解释了,听说有了SDK和一些xx东西的话你可以用任何文本编辑器写好代码
  然后用命令行编译执行。但是最方便的大概就是用所谓的flex builder了,它看上去是个很像eclipse的东西,
  因为它根本就只是在eclipse上搞了点小插件而已:)"




 

posted @ 2008-05-30 15:54 kenlistian 阅读(590) | 评论 (0)编辑 收藏

仅列出标题
共42页: First 29 30 31 32 33 34 35 36 37 Last