我想订购 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;
}
}
由于最后一个字母代表花色,因此您可以使用它来按花色对卡片进行排序。要按值排序,请创建一个具有有效顺序的列表,并比较不带最后一个字母的字符串的索引。使用 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));
}
}