通過長達半個小時的抉擇,我終於下了一個很讓人心痛的決定,重構了對子優先排序類,先列出最新的代碼。java
/** * <p>Title: PairPrecedenceSort.java</p> * <p>Description:炸彈三個對子優先排序 </p> * <p>Copyright: Copyright (c) 2007</p> * @author Tunie * @date 2014年9月15日 * @version 1.0 */ public class PairPrecedenceSort implements ICardGroupSort { public void sort(List<Card> list) { //從大到小排序 CardGroup cardGroup = new CardGroup(); cardGroup.addAll(list); cardGroup.doSort(CardGroupSortType.DECREASE); //優化算法 if(cardGroup.size() < 3 ) return; // 從列表中取出對子,三個及炸彈牌形 List<CardGroup> bombCardGroups = new ArrayList<CardGroup>(); List<CardGroup> threeCardGroups = new ArrayList<CardGroup>(); List<CardGroup> pairCardGroups = new ArrayList<CardGroup>(); int index = 0; if (cardGroup.getCardList().get(index).isBigKing() && cardGroup.getCardList().get(index + 1).isSmallKing()) { bombCardGroups.add(cardGroup.removeRange(0, 2)); } while(index < cardGroup.size() - 1) { if(cardGroup.subCardGroup(index, index + 2).isSame()) { if((index + 3 <= cardGroup.size()) && cardGroup.subCardGroup(index, index + 3).isSame()) { if((index + 4 <= cardGroup.size()) && cardGroup.subCardGroup(index, index + 4).isSame()) { bombCardGroups.add(cardGroup.removeRange(index, index + 4)); continue; } threeCardGroups.add(cardGroup.removeRange(index, index + 3)); continue; } pairCardGroups.add(cardGroup.removeRange(index, index + 2)); continue; } ++index; } // 對牌形大小進行比較,與以前的列表合併 List<Card> tempList = new ArrayList<Card>(); for(int i = 0 ; i < bombCardGroups.size() ; i++) { tempList.addAll(bombCardGroups.get(i).getCardList()); } for(int i = 0 ; i < threeCardGroups.size() ; i++) { tempList.addAll(threeCardGroups.get(i).getCardList()); } for(int i = 0 ; i < pairCardGroups.size() ; i++) { tempList.addAll(pairCardGroups.get(i).getCardList()); } if(!tempList.isEmpty()) { cardGroup.getCardList().addAll(0, tempList); list.clear(); list.addAll(cardGroup.getCardList()); } } }
呵呵,主要修改就是將對子優先,改了炸彈三個對子優先排序,使用這種排序以後,炸彈永遠在三個對子及單牌以前,同理,就不囉嗦了。算法