这里描述的多态算法是Java平台提供的可重用功能。所有这些都来自 Collections
类,并且都采用静态方法的形式,其第一个参数是要在其上执行操作的集合。Java平台提供的绝大多数算法都在List
实例上运行,但其中一些算法 在任意 Collection
实例上运行。本节简要介绍以下算法:
- 排序
- 洗牌
- 常规数据操作
- 搜索
- 组成
- 最值
-
该
sort
算法重新排序aList
,使得其元素根据排序关系按升序排列。提供了两种形式的操作。简单形式List
根据其元素的自然顺序对其进行排序和排序。如果您不熟悉自然排序的概念,请阅读 对象排序部分。该
sort
操作使用一种快速稳定的略微优化的合并排序算法: - 快速:保证及时运行
n log(n)
并在几乎排序的列表上运行得更快。经验测试显示它与高度优化的快速排序一样快。快速排序通常被认为比合并排序更快但不稳定并且不保证n log(n)
性能。 - 稳定:它不会重新排序相同的元素。如果您对不同的属性重复排序相同的列表,这一点很重要。如果邮件程序的用户通过邮寄日期对收件箱进行排序,然后由发件人对其进行排序,则用户自然希望来自给定发件人的现在连续的邮件列表(仍)按邮件日期排序。仅当第二种排序稳定时才能保证这一点。
-
第二种形式除了
sort
aComparator
之外还用aList
对元素进行排序Comparator
。假设您想要以相反的大小顺序打印出我们之前示例中的anagram组 - 首先是最大的anagram组。下面的示例向您展示了如何借助方法的第二种形式实现此目的sort
。回想一下,anagram组
Map
以List
实例的形式存储为a 中的值。通过修改后的打印代码迭代Map
的值查看,把每List
即通过最小尺寸测试成List
的List
第 然后代码List
使用Comparator
期望List
实例对此进行排序,并实现反向大小排序。最后,代码遍历排序List
,打印其元素(anagram组)。以下代码替换示例中main
方法末尾的打印代码Anagrams
。
洗牌
该shuffle
算法的作用与此相反sort
,破坏了可能存在于a中的任何顺序List
。也就是说,该算法List
基于来自随机源的输入重新排序,使得假设公平的随机源,所有可能的排列以相等的可能性发生。该算法在实现机会游戏时很有用。例如,它可以用于混洗代表甲板List
的Card
对象。此外,它对生成测试用例很有用。
此操作有两种形式:一种采用a List
并使用默认的随机源,另一种需要调用者提供 Random对象以用作随机源。该算法的代码用作本List
节中的示例 。
规数据操作
本Collections
类提供了做日常的数据处理5个对比算法List
对象,所有这些都是非常简单:
reverse
- 颠倒a中元素的顺序List
。fill
-List
用指定的值覆盖a中的每个元素。此操作对于重新初始化a非常有用List
。copy
- 接受两个参数,一个目标List
和一个源List
,并将源的元素复制到目标中,覆盖其内容。目的地List
必须至少与来源一样长。如果它更长,则目标List
中的其余元素不受影响。swap
- 将元素交换到a中的指定位置List
。addAll
- 将所有指定的元素添加到aCollection
。要添加的元素可以单独指定,也可以指定为数组。
该binarySearch
算法搜索已排序的指定元素List
。该算法有两种形式。第一个采用a List
和元素来搜索(“搜索关键字”)。此表单假定List
根据其元素的自然顺序按升序排序。第二种形式Comparator
除了List
搜索键和搜索键外,还假设List
按照指定的顺序按升序排序Comparator
。该sort
算法可用于List
在调用之前对其进行排序binarySearch
。
组成
频率和不相交算法测试一个或多个组成的某些方面Collections
:
frequency
- 计算指定元素在指定集合中出现的次数disjoint
- 确定两个Collections
是否脱节; 也就是说,它们是否不包含任何共同的元素-
寻找极值价值观
的min
和max
算法返回,分别包含在指定的最小和最大元素Collection
。这两种操作都有两种形式。简单形式只接受a Collection
并根据元素的自然顺序返回最小(或最大)元素。第二种形式Comparator
除了Collection
和之外还根据指定的方式返回最小(或最大)元素Comparator
。