Java核心技术卷I基础知识3.10.5 数组排序

3.10.5 数组排序

要想对数值型数组进行排序,可以使用Arrays类中的sort方法:

 

这个方法使用了优化的快速排序算法。快速排序算法对于大多数数据集合来说都是效率比较高的。Arrays类还提供了几个使用很便捷的方法,在稍后的API注释中将介绍它们。

程序清单3-7中的程序用到了数组,它产生一个抽彩游戏中的随机数值组合。假如抽彩是从49个数值中抽取6个,那么程序可能的输出结果为:

 

 

要想选择这样一个随机的数值集合,就要首先将数值1,2,…,n存入数组numbers中:

 

而用第二个数组存放抽取出来的数值:

 

现在,就可以开始抽取k个数值了。Math.random方法将返回一个0到1之间(包含0、不包含1)的随机浮点数。用n乘以这个浮点数,就可以得到从0到n-1之间的一个随机数。

 

下面将result的第i个元素设置为numbers[r]存放的数值,最初是r+1。但正如所看到的,numbers数组的内容在每一次抽取之后都会发生变化。

 

现在,必须确保不会再次抽取到那个数值,因为所有抽彩的数值必须不相同。因此,这里用数组中的最后一个数值改写number[r],并将n减1。

 

关键在于每次抽取的都是下标,而不是实际的值。下标指向包含尚未抽取过的数组元素。

在抽取了k个数值之后,就可以对result数组进行排序了,这样可以让输出效果更加清晰:

 

程序清单3-7 LotteryDrawing/LotteryDrawing.java

 

 

 

java.util.Arrays
1.2

static String
toString(type[] a)  5.0

返回包含a中数据元素的字符串,这些数据元素被放在括号内,并用逗号分隔。

参数:a      类型为int、long、short、char、byte、boolean、f?loat或double的数组。

static type
copyOf(type[] a, int length) 6

static type
copyOfRange(type[] a, int start, int end) 6

返回与a类型相同的一个数组,其长度为length或者end-start,数组元素为a的值。

参数:a      类型为int、long、short、char、byte、boolean、f?loat或double的数组。

   start  起始下标(包含这个值)。

   end   终止下标(不包含这个值)。这个值可能大于a.length。在这种情况下,结果为0或false。

   length     拷贝的数据元素长度。如果length值大于a.length,结果为0或false;否则,数组中只有前面length个数据元素的拷贝值。

static void
sort(type[] a)

采用优化的快速排序算法对数组进行排序。

参数:a      类型为int、long、short、char、byte、boolean、f?loat或double的数组。

static int binarySearch(type[]
a, type v)

static int
binarySearch(type[] a, int start, int end, type v)  6

采用二分搜索算法查找值v。如果查找成功,则返回相应的下标值;否则,返回一个负数值r。-r-1是为保持a有序v应插入的位置。

参数:a      类型为int、long、short、char、byte、boolean、f?loat或double的有序数组。

   start  起始下标(包含这个值)。

   end   终止下标(不包含这个值)。

   v      同a的数据元素类型相同的值。

static void
f?ill(type[] a, type v)

将数组的所有数据元素值设置为v。

参数:a      类型为int、long、short、char、byte、boolean、f?loat或double的数组。

   v      与a数据元素类型相同的一个值。

static boolean
equals(type[] a, type[] b)

如果两个数组大小相同,并且下标相同的元素都对应相等,返回true。

参数:a、b 类型为int、long、short、char、byte、boolean、f?loat或double的两个数组。

时间: 2024-10-26 12:38:46

Java核心技术卷I基础知识3.10.5 数组排序的相关文章

Java核心技术卷I基础知识3.10.1 for each循环

3.10.1 for each循环 Java有一种功能很强的循环结构,可以用来依次处理数组中的每个元素(其他类型的元素集合亦可)而不必为指定下标值而分心. 这种增强的for循环的语句格式为:   定义一个变量用于暂存集合中的每一个元素,并执行相应的语句(当然,也可以是语句块).collection这一集合表达式必须是一个数组或者是一个实现了Iterable接口的类对象(例如ArrayList).有关数组列表的内容将在第5章中讨论,有关Iterable接口的内容将在第9章中讨论. 例如,   打印

Java核心技术卷I基础知识3.10.6 多维数组

3.10.6 多维数组 多维数组将使用多个下标访问数组元素,它适用于表示表格或更加复杂的排列形式.这一节的内容可以先跳过,等到需要使用这种存储机制时再返回来学习. 假设需要建立一个数值表,用来显示在不同利率下投资$10,000会增长多少,利息每年兑现,而且又被用于投资(见表3-8). 表3-8 不同利率下的投资增长情况 10%     11%     12%     13%     14%     15% 10 000.00    10 000.00    10 000.00    10 000

Java核心技术卷I基础知识3.10 数组

3.10 数组 数组是一种数据结构,用来存储同一类型值的集合.通过一个整型下标可以访问数组中的每一个值.例如,如果a是一个整型数组,a[i]就是数组中下标为i的整数. 在声明数组变量时,需要指出数组类型(数据元素类型紧跟[])和数组变量的名字.下面声明了整型数组a:   不过,这条语句只声明了变量a,并没有将a初始化为一个真正的数组.应该使用new运算符创建数组.   这条语句创建了一个可以存储100个整数的数组.数组长度不要求是常量:new int[n]会创建一个长度为n的数组.      

Java核心技术卷I基础知识3.10.4 命令行参数

3.10.4 命令行参数 前面已经看到多个使用Java数组的示例.每一个Java应用程序都有一个带String arg[]参数的main方法.这个参数表明main方法将接收一个字符串数组,也就是命令行参数. 例如,看一看下面这个程序:   如果使用下面这种形式运行这个程序:   args数组将包含下列内容:   这个程序将显示下列信息:         C++注释:在Java应用程序的main方法中,程序名并没有存储在args数组中.例如,当使用下列命令运行程序时   args[0]是"-h&q

Java核心技术卷I基础知识3.10.3 数组拷贝

3.10.3 数组拷贝 在Java中,允许将一个数组变量拷贝给另一个数组变量.这时,两个变量将引用同一个数组:   图3-14显示了拷贝的结果.如果希望将一个数组的所有值拷贝到一个新的数组中去,就要使用Arrays类的copyOf方法:   第2个参数是新数组的长度.这个方法通常用来增加数组的大小:   如果数组元素是数值型,那么多余的元素将被赋值为0:如果数组元素是布尔型,则将赋值为false.相反,如果长度小于原始数组的长度,则只拷贝最前面的数据元素.       C++注释:Java数组与

Java核心技术卷I基础知识1.2.10 多线程

1.2.10 多线程 多线程可以带来更好的交互响应和实时行为. 如今,我们非常关注并发性,因为摩尔定律行将完结.我们不再追求更快的处理器,而是着眼于获得更多的 处理器,而且要让它们一直保持工作.不过,可以看到,大多数编程语言对于这个问题并没有显示出足够的 重视. Java在当时很超前.它是第一个支持并发程序设计的主流语言.从白皮书中可以看到,它的出发点稍有些不 同.当时,多核处理器还很神秘,而Web编程才刚刚起步,处理器要花很长时间等待服务器响应,需要并发 程序设计来确保用户界面不会"冻住&qu

Java核心技术卷I基础知识1.5 关于Java的常见误解

1.5 关于Java的常见误解 在结束本章之前,我们列出了一些关于Java的常见误解,同时给出了解释. 1.?Java是HTML的扩展 Java是一种程序设计语言:HTML是一种描述网页结构的方式.除了用于在网页上放置Java applet的HTML扩展之外,两者没有任何共同之处. 2.?使用XML,所以不需要Java Java是一种程序设计语言:XML是一种描述数据的方式.可以使用任何一种程序设计语言处理XML数据,而Java API对XML处理提供了很好的支持.此外,许多重要的第三方XML工

Java核心技术卷I基础知识3.7.3 文件输入与输出

3.7.3 文件输入与输出 要想对文件进行读取,就需要一个用File对象构造一个Scanner对象,如下所示:   如果文件名中包含反斜杠符号,就要记住在每个反斜杠之前再加一个额外的反斜杠: "c:\\mydirectory\\myf?ile.txt".       注释:在这里指定了UTF-8字符编码,这对于互联网上的文件很常见(不过并不是普遍适用).读取一个文本文件时,要知道它的字符编码--更多信息参见卷Ⅱ第2章.如果省略字符编码,则会使用运行这个Java程序的机器的"默

Java核心技术卷I基础知识3.6.6 码点与代码单元

3.6.6 码点与代码单元 Java字符串由char值序列组成.从3.3.3节"char类型"已经看到,char数据类型是一个采用UTF-16编码表示Unicode码点的代码单元.大多数的常用Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示. length方法将返回采用UTF-16编码表示的给定字符串所需要的代码单元数量.例如:   要想得到实际的长度,即码点数量,可以调用:   调用s.charAt(n)将返回位置n的代码单元,n介于0-s.length(