如何在java中按顺序(顺序)对13张随机扑克牌进行排序?

问题描述 投票:0回答:1

我想订购 13 张扑克牌,顺序为梅花、方块、红心和黑桃,顺序为 2,3,4,5,6,7,8,9,10,J,Q,K,A。 例如

4C
表示“梅花 4”。

我尝试使用下面的代码来像这样向北的示例播放器订购它们

4H 5H 8C 8D 9H 9D AC 6S 5D 6D KD 10C AD

结果是

8C AC 10C 5D 6D 8D 9D AD KD 4H 5H 9H 6S

我预料到了结果

8C 10C AC 5D 6D 8D 9D KD AD 4H 5H 9H 6S

这是代码


import java.util.ArrayList;

public class Test {

    public static void main(String[] args) {
        String[] sTest = {"4H", "5H", "8C", "8D", "9H", "9D", "AC", "6S", "5D", "6D", "KD", "10C", "AD" };
        
        for (int i=0;i<13;i++) {
            System.out.print(sTest[i]+" ");
        }
        System.out.println();
        System.out.println("Sorting");
        ArrayList<String> tmp = sortEnd2Begin(sTest);
        tmp.forEach((String myCard) ->{
            System.out.print(myCard+" ");
        });
        System.out.println();
    }
    
    private static ArrayList<String> sortEnd2Begin(String[] myCards) {
        ArrayList<String> myNewCards = new ArrayList<>();
        myNewCards.add(myCards[0]);
        for (int i=1;i<myCards.length;i++) {
            // loop for unordered myCards
            String card2Sort = myCards[i];
            for (int j=0;j<myNewCards.size();j++) {
                // loop for ordered myNewCards
                // find until card2Sort equal or bigger then existing list
                String cardIterate = myNewCards.get(j);
                int iterMax = card2Sort.length();
                if (card2Sort.length() > cardIterate.length()) {
                    iterMax = cardIterate.length();
                }
                int posCard = beforeOrAfter(card2Sort, cardIterate, 0, iterMax);
                if (posCard==0 || posCard<0) {
                    myNewCards.add(j, card2Sort);
                    break;
                } else {
                    // TODO 
                    //System.out.println(j); // debug
                    if (j+1==myNewCards.size()) {
                        // end of list
                        myNewCards.add(card2Sort);
                        break;
                    }
                }
            }

        }
        return myNewCards;
    }
    
    // -1 wordA before wordB
    // 0 wordA equal wordB
    // 1 wordA after wordB
    private static int beforeOrAfter(String wordA, String wordB, int iterX, int iterMax) {
        //System.out.println(wordA+" "+wordB+" "+iterX+" "+iterMax);
        int inA = wordA.length()-1-iterX;
        int inB = wordB.length()-1-iterX;
        char cA = wordA.charAt(inA);
        char cB = wordB.charAt(inB);
        int retValue = 0;
        if (iterX+1==iterMax) {
            // we reach max recursive {
            //System.out.println(iterX+" "+iterMax+" "+cA+" "+cB); // debug
            if (cA==cB) {
                //System.out.println("Debug"); // debug
                if (wordA.length()<wordB.length())  {
                    retValue = -1;
                } else if (wordA.length()>wordB.length())  {
                    retValue = 1;
                } else {
                    retValue = 0; // equal letters and length
                }
            } else if (cA<cB) {
                //retValue = -1;  // ori
                if (wordA.length()>wordB.length()) {
                    retValue = 1;
                } else {
                    retValue = -1;
                }
            } else if (cA>cB) {
                retValue = 1; // ori
            }
        } else {
            if (cA<cB) {
                //System.out.println(cA+" < "+cB+" "+(cA < cB)); // debug
                retValue = -1; // ori
            } else if (cA>cB) {
                //System.out.println(cA+" > "+cB+" "+(cA > cB)); // debug
                retValue = 1; // ori

            } else {
                //System.out.println(cA+" = "+cB+" "+(cA == cB)); // debug
                retValue = beforeOrAfter(wordA, wordB, iterX+1, iterMax);
            }
        }
        return retValue;
    }
}

java arrays string sorting
1个回答
0
投票

由于最后一个字母代表花色,因此您可以使用它来按花色对卡片进行排序。要按值排序,请创建一个具有有效顺序的列表,并比较不带最后一个字母的字符串的索引。使用 Comparator 接口,可以让您更轻松地进行链接排序,并使您的代码更具可读性

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class Example {

    public static void main(String[] args) {
        List<String> order = List.of("2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A");

        String[] sTest = {"4H", "5H", "8C", "8D", "9H", "9D", "AC", "6S", "5D", "6D", "KD", "10C", "AD" };

        // compare by last char
        Comparator<String> bySuits = Comparator.comparingInt(s -> s.charAt(s.length()-1));

        //compare by the index of substring as they appear in the list
        Comparator<String> byValue = Comparator.comparingInt(s -> order.indexOf(s.substring(0, s.length()-1)));


        System.out.println("Before sorting: " + Arrays.toString(sTest));

        // compare by chaining the two comparators
        Arrays.sort(sTest, bySuits.thenComparing(byValue));

        System.out.println("After sorting: " + Arrays.toString(sTest));
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.