عملية compareCard
بالنسبة للأنواع البسيطة، تقارن العوامل الشرطية القيم وتحدد أيها أكبر أو أصغر من الآخر. هذه العوامل (> و < وغيرها) لا تعمل مع الأنواع الكائنية. بالنسبة للسلاسل المحرفية توفر Java عملية compareTo. بالنسبة لأوراق اللعب علينا كتابة واحدة بنفسنا، والتي سنسميها compareCard. لاحقاً، سنستخدم هذه العملية لترتيب مجموعة أوراق اللعب.
بعض المجموعات مرتبة كلياً، بمعنى أنك تستطيع المقارنة بين أي عنصرين وأن تعرف أيهما أكبر. الأعداد الصحيحة والعشرية هي مجموعات مرتبة كلياً. بعض المجموعات غير مرتبة، ما يعني عدم وجود طريقة منطقية لنقول أن عنصراً ما أكبر من عنصر آخر. الفاكهة هي مجموعة غير مرتبة، ولذلك لا نستطيع المقارنة بين التفاح والبرتقال. في Java، النوع البولياني غير مرتب؛ لا يمكننا القول أن true أكبر من flase.
مجموعة ورق اللعب مرتبة جزئياً، أي أننا نستطيع المقارنة بين الأوراق أحياناً وأحياناً لا نستطيع. مثلاً، أنا أعلم أن 3 الزهر أعلى من 2 زهر، وأن 3 ديناري أعلى من 3 زهر. لكن أيهما أعلى، 3 زهر أم 2 ديناري؟ أحدهما من رتبة أعلى، لكن الآخر منظومته أعلى.
لنجعل الأوراق قابلة للمقارنة، علينا أن نقرر أيهما ذا قيمة أكثر، الرتبة أم المنظومة. الخيار عشوائي، لكن عندما تشتري مجموعة ورق جديدة، تأتي مرتبة وكل أوراق الزهر معاً، تليها أوراق الديناري وهكذا. لذا سنقول أن المنظومة ذات قية أكثر.
بعد أن اعتمدنا ذلك، يمكننا كتابة compareCard. تأخذ ورقتين (كائنين من نوع Card) كمعاملين وتعيد 1 إذا ربحت الورقة أولى، 1- إذا ربحت الورقة الثانية، و0 إذا كانتا متساويتين.
أولاً نقارن المنظومات:
كود:
if (c1.suit > c2.suit) return 1;
if (c1.suit < c2.suit) return -1
;
إذا لم تتحقق أي من التعليمتين، فلا بد أن المنظومتين متساويتين، وعلينا مقارنة الرتب:
كود:
if (c1.rank > c2.rank) return 1;
if (c1.rank < c2.rank) return -1;
إذا لم تتحقق أي من هذه أيضاً، فلا بد أن الرتب متساوية، لذا نعيد القيمة 0.

تمرين 13.1

غلف هذه الشفرة في عملية. ثم عـدلها بحيث تكون ورقة الآص أعلى من الشيخ.


lk ;jhf ;dt jt;v ;uhgl ;lfd,jv gyi [hth hgehge uav lwt,thj hg;hzkhj : gyi hgehge hg;hzkhj jt;v [hth uav ;lfd,jv ;jhf ;dt