通过长达半个小时的抉择,我终于下了一个很让人心痛的决定,重构了对子优先排序类,先列出最新的代码。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()); } } }
呵呵,主要修改就是将对子优先,改了炸弹三个对子优先排序,使用这种排序以后,炸弹永远在三个对子及单牌以前,同理,就不啰嗦了。算法