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的两个数组。