|
1 |
| -# 比较 |
| 1 | +《《《 [返回首页](../README.md) <br/> |
| 2 | +《《《 [上一节](03_A_Fruity_Example.md) |
2 | 3 |
|
3 |
| -有时候我们想要比较没有实现 `Comparable` 接口的对象,或者使用与该接口指定的不同顺序来比较对象。 由 `Comparable` 接口提供的顺序称为自然顺序,所以 `Comparator` 接口可以说是一种不自然的顺序。 |
| 4 | +### 比较 |
| 5 | + |
| 6 | +有时候我们想要比较没有实现 `Comparable` 接口的对象,或者使用与该接口指定的不同顺序来比较对象。 由 `Comparable` 接口提供的顺序称为自然顺序,所以 |
| 7 | +`Comparator` 接口可以说是一种不自然的顺序。 |
4 | 8 |
|
5 | 9 | 我们使用 `Comparator` 接口指定附加排序,它包含两种方法:
|
6 | 10 |
|
|
11 | 15 | }
|
12 | 16 | ```
|
13 | 17 |
|
14 |
| -根据第一个对象是否小于,等于或大于第二个对象,`compare` 方法返回一个负值,零或正的值 - 就像 `compareTo` 一样。 (`equals` 方法是类 `Object` 所熟悉的方法;它包含在接口中,用于提醒实现者相同的比较器必须具有强制执行相同排序的比较方法。) |
| 18 | +根据第一个对象是否小于,等于或大于第二个对象,`compare` 方法返回一个负值,零或正的值 - 就像 `compareTo` 一样。 (`equals` 方法是类 `Object` 所熟 |
| 19 | +悉的方法;它包含在接口中,用于提醒实现者相同的比较器必须具有强制执行相同排序的比较方法。) |
15 | 20 |
|
16 |
| -例3-1。 允许苹果与橘子进行比较 |
| 21 | +例 `3-1`。 允许苹果与橘子进行比较 |
17 | 22 |
|
18 | 23 | ```java
|
19 | 24 | abstract class Fruit implements Comparable<Fruit> {
|
|
59 | 64 | }
|
60 | 65 | ```
|
61 | 66 |
|
62 |
| -例3-2。 禁止苹果与橘子进行比较 |
| 67 | +例 `3-2`。 禁止苹果与橘子进行比较 |
63 | 68 |
|
64 | 69 | ```java
|
65 | 70 | abstract class Fruit {
|
|
128 | 133 |
|
129 | 134 | 在自然字母顺序中,“two”大于“three”,而在大小排序中它更小。
|
130 | 135 |
|
131 |
| -`Java` 库总是提供 `Comparable` 和 `Comparator` 之间的选择。 对于每个带有由 `Comparable` 限定的类型变量的泛型方法,还有另一个类型为 `Comparator` 的参数的泛型方法。 例如,对应于: |
| 136 | +`Java` 库总是提供 `Comparable` 和 `Comparator` 之间的选择。 对于每个带有由 `Comparable` 限定的类型变量的泛型方法,还有另一个类型为 `Comparator` |
| 137 | +的参数的泛型方法。 例如,对应于: |
132 | 138 |
|
133 | 139 | ```java
|
134 | 140 | public static <T extends Comparable<? super T>>
|
|
165 | 171 | }
|
166 | 172 | ```
|
167 | 173 |
|
168 |
| -与之前的版本相比,唯一的变化就是在我们写了 `candidate.compareTo(elt)` 之前,现在我们写了 `cmp.compare(candidate,elt)`。 (为了便于参考,这个代码和下面的内容在例3-3中进行了总结。) |
| 174 | +与之前的版本相比,唯一的变化就是在我们写了 `candidate.compareTo(elt)` 之前,现在我们写了 `cmp.compare(candidate,elt)`。 (为了便于参考,这个代码 |
| 175 | +和下面的内容在例 `3-3` 中进行了总结。) |
169 | 176 |
|
170 | 177 | 定义一个提供自然排序的比较器很容易:
|
171 | 178 |
|
|
220 | 227 | }
|
221 | 228 | ```
|
222 | 229 |
|
223 |
| -(这样结束了例3-3中总结的代码)。 |
| 230 | +(这样结束了例 `3-3` 中总结的代码)。 |
224 | 231 |
|
225 |
| -集合框架确实提供了两个版本,分别是 `min` 和 `max`,这里给出了签名,参见 `17.1` 节。然而,如果你检查库的源代码,你会发现四者中没有一个是以其他方式定义的;相反,每个都是直接定义的。更直接的版本更长,更难维护,但速度更快。使用 `Sun`当前的 `JVM`,测量结果显示加速大约 `30%`。这种加速是否值得代码复制取决于代码的使用情况。由于 `Java`实用程序很可能被用于关键的内部循环,因此类库的设计人员更喜欢执行速度而非表达式的经济性。但情况并非总是如此。`30%`的提高听起来会让人印象深刻,但除非程序的总时间很长,并且程序出现在重复使用的内部循环中,否则这种提高并不重要。不要让你自己的代码不必要地延长,只是为了克服一点点改进。 |
| 232 | +集合框架确实提供了两个版本,分别是 `min` 和 `max`,这里给出了签名,参见 `17.1` 节。然而,如果你检查库的源代码,你会发现四者中没有一个是以其他方式定 |
| 233 | +义的;相反,每个都是直接定义的。更直接的版本更长,更难维护,但速度更快。使用 `Sun`当前的 `JVM`,测量结果显示加速大约 `30%`。这种加速是否值得代码复制 |
| 234 | +取决于代码的使用情况。由于 `Java`实用程序很可能被用于关键的内部循环,因此类库的设计人员更喜欢执行速度而非表达式的经济性。但情况并非总是如此。`30%` |
| 235 | +的提高听起来会让人印象深刻,但除非程序的总时间很长,并且程序出现在重复使用的内部循环中,否则这种提高并不重要。不要让你自己的代码不必要地延长,只是为 |
| 236 | +了克服一点点改进。 |
226 | 237 |
|
227 | 238 | 作为比较器的最后一个例子,下面是一个方法,它在元素上使用比较器并在元素列表上返回一个比较器:
|
228 | 239 |
|
|
242 | 253 | }
|
243 | 254 | ```
|
244 | 255 |
|
245 |
| -循环比较两个列表中的相应元素,并在发现不相等的相应元素时(在这种情况下,认为较小元素的列表较小)或到达任一列表的末尾(在这种情况下, 较短的列表被认为较小)。 这是通常的列表排序; 如果我们将字符串转换为字符列表,它会给出字符串的通常排序。 |
246 |
| - |
247 |
| - |
248 |
| - |
249 |
| - |
250 |
| - |
251 |
| - |
252 |
| - |
253 |
| - |
254 |
| - |
255 |
| - |
256 |
| - |
257 |
| - |
258 |
| - |
259 |
| - |
260 |
| - |
261 |
| - |
262 |
| - |
263 |
| - |
264 |
| - |
265 |
| - |
266 |
| - |
267 |
| - |
268 |
| - |
269 |
| - |
270 |
| - |
271 |
| - |
272 |
| - |
273 |
| - |
| 256 | +循环比较两个列表中的相应元素,并在发现不相等的相应元素时(在这种情况下,认为较小元素的列表较小)或到达任一列表的末尾(在这种情况下, 较短的列表被认为 |
| 257 | +较小)。 这是通常的列表排序; 如果我们将字符串转换为字符列表,它会给出字符串的通常排序。 |
274 | 258 |
|
| 259 | +《《《 [下一节](05_Enumerated_Types.md) <br/> |
| 260 | +《《《 [返回首页](../README.md) |
0 commit comments