13.5 方法subdeck

合并算法的第一步是将整副牌分成两堆,每堆大约为半副牌。因此,我们可能需要一个名为 subdeck 的方法,让它接受两个指定索引范围的值,并返回新的 Deck 对象,其中包含指定范围内的牌:

  1. public Deck subdeck(int low, int high) {
  2. Deck sub = new Deck(high - low + 1);
  3. for (int i = 0; i < sub.cards.length; i++) {
  4. sub.cards[i] = this.cards[low + i];
  5. }
  6. return sub;
  7. }

第 1 行创建了一个未填充的 Deck 对象。在 for 循环中,复制当前 Deck 对象中的引用,并用它们填充新创建的 Deck 对象。

Deck 对象中的数组长度为 high - low + 1,因为索引为 low 和 high 的牌都包含在内。这种计算可能令人迷惑,如果忘记加 1,将导致“差一”错误。通常来说,绘图是避免这种错误的最佳方式。

图 13-2 所示的状态图显示了 low = 0high = 4 时将创建的新 Deck 对象。这个对象包含与原始 Deck 对象共享的 5 张牌,即它们互为别名。

{%}

图 13-2:对 subdeck 带来的影响进行说明的状态图

互为别名可能不是什么好主意,因为修改共享的牌将影响多个 Deck 对象。然而,因为 Card 对象是不可修改的,所以就这里而言,互为别名不会带来任何问题。