This is the code to shuffle 52 playing cards for 4 players and re order each hand cards. I provide to order card base on trump (at right side).
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class Test {
/*
* TODO how to repesent card
*/
public final static String[] S_CLUB = {
"2C",
"3C",
"4C",
"5C",
"6C",
"7C",
"8C",
"9C",
"10C",
"JC", //JC
"QC", //QC
"KC", //KC
"AC" //AC
};
public final static String[] S_DIAMOND = {
"2D",
"3D",
"4D",
"5D",
"6D",
"7D",
"8D",
"9D",
"10D",
"JD",
"QD",
"KD",
"AD"
};
public final static String[] S_HEART = {
"2H",
"3H",
"4H",
"5H",
"6H",
"7H",
"8H",
"9H",
"10H",
"JH",
"QH",
"KH",
"AH"
};
public final static String[] S_SPADE = {
"2S",
"3S",
"4S",
"5S",
"6S",
"7S",
"8S",
"9S",
"10S",
"JS",
"QS",
"KS",
"AS"
};
public static void main(String[] args) {
long startTime = System.nanoTime();
shuffleCard();
long endTime = System.nanoTime();
System.out.println("North");
for (int i=0;i<13;i++) {
System.out.print(north[i]+" ");
}
System.out.println();
System.out.println("After Sorting");
ArrayList<String> tmp = sortEnd2Begin(north);
tmp.forEach((String myCard) ->{
System.out.print(myCard+" ");
});
System.out.println();
System.out.println("EAST");
for (int i=0;i<13;i++) {
System.out.print(east[i]+" ");
}
System.out.println();
System.out.println("After Sorting");
tmp = sortEnd2Begin(east);
tmp.forEach((String myCard) ->{
System.out.print(myCard+" ");
});
System.out.println();
System.out.println("South");
for (int i=0;i<13;i++) {
System.out.print(south[i]+" ");
}
System.out.println();
System.out.println("After Sorting");
tmp = sortEnd2Begin(south);
tmp.forEach((String myCard) ->{
System.out.print(myCard+" ");
});
System.out.println();
System.out.println("West");
for (int i=0;i<13;i++) {
System.out.print(west[i]+" ");
}
System.out.println();
System.out.println("After Sorting");
tmp = sortEnd2Begin(west);
tmp.forEach((String myCard) ->{
System.out.print(myCard+" ");
});
System.out.println();
System.out.println((endTime-startTime)%1000000+" mili"); // time_ms % 1E+3 + " MicroSeconds, "
}
static String[] north = new String[13];
static String[] east = new String[13];
static String[] south = new String[13];
static String[] west = new String[13];
private static void shuffleCard() {
//TODO
ArrayList<String> cards = new ArrayList<>();
List<String> listCard = Arrays.asList(S_CLUB);
cards.addAll(listCard);
listCard = Arrays.asList(S_DIAMOND);
cards.addAll(listCard);
listCard = Arrays.asList(S_HEART);
cards.addAll(listCard);
listCard = Arrays.asList(S_SPADE);
cards.addAll(listCard);
//System.out.println("card number: "+cards.size()); // debug
cards = shuffle(1,cards);
//System.out.println("Distribution "+cards.size());
int topPosition = cards.size()-1;
for (int i=0;i<13;i++) {
//System.out.println("north "+i+" "+topPosition); // debug
String tmp = cards.get(topPosition);
cards.remove(topPosition);
topPosition --;
north[i] = tmp;
//System.out.println("east "+i+" "+topPosition); // debug
tmp = cards.get(topPosition);
cards.remove(topPosition);
topPosition --;
east[i] = tmp;
//System.out.println("south "+i+" "+topPosition); // debug
tmp = cards.get(topPosition);
cards.remove(topPosition);
topPosition --;
south[i] = tmp;
//System.out.println("west "+i+" "+topPosition); // debug
tmp = cards.get(topPosition);
cards.remove(topPosition);
topPosition --;
west[i] = tmp;
}
}
static Random rand = new Random();
private static ArrayList<String> shuffle(int numSuffle, ArrayList<String> cards) {
//System.out.println("Suffle: "+numSuffle); // debug
Collections.shuffle(cards, rand);
//System.out.println("Card size "+cards.size()); // debug
if (numSuffle>0) {
shuffle(numSuffle-1, cards);
}
return cards;
}
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 posCard = beforeOrAfter(card2Sort, cardIterate, 0, iterMax);
int posCard = beforeOrAfter2(card2Sort, cardIterate);
if (posCard<=0) {
myNewCards.add(j, card2Sort);
break;
} else {
//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
* suite order less C D H S higher
* value suit less 0 1 2 3 4 5 6 7 8 9 A J K Q
* map 10 to A
* J to B
* Q to C
* K to D
* A to E
*/
private static int beforeOrAfter2(String wordA, String wordB) {
//System.out.print("word "+wordA+" "+wordB+" "); // debug
char charA = wordA.charAt(wordA.length()-1);
char charB = wordB.charAt(wordB.length()-1);
//System.out.println(wordA+" "+wordB+" End "+charA+" "+charB+" "); // debug
if (charA<charB) {
return -1;
} else if (charA>charB) {
return 1;
} else {
// equal
charA = wordA.charAt(wordA.length()-2);
charB = wordB.charAt(wordB.length()-2);
// mapping charA to correct order
if (charA=='0') {
charA='A';
} else if (charA=='J') {
charA='B';
} else if (charA=='Q') {
charA='C';
} else if (charA=='K') {
charA='D';
} else if (charA=='A') {
charA='E';
}
// mapping charB to correct order
if (charB=='0') {
charB='A';
} else if (charB=='J') {
charB='B';
} else if (charB=='Q') {
charB='C';
} else if (charB=='K') {
charB='D';
} else if (charB=='A') {
charB='E';
}
//System.out.println(" First "+charA+" "+charB); // debug
if (charA<charB) {
return -1;
} else if (charA>charB) {
return 1;
}
}
return 0;
}
public static ArrayList<String> sortCardsWithTrump(ArrayList<String> myCards, char trump) {
ArrayList<String> myNewCards = new ArrayList<>();
myNewCards.add(myCards.get(0));
for (int i=1;i<myCards.size();i++) {
// loop for unordered myCards
String card2Sort = myCards.get(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 posCard = beforeOrAfter(card2Sort, cardIterate, 0, iterMax);
int posCard = beforeOrAfter2Trump(card2Sort, cardIterate, trump);
if (posCard<=0) {
myNewCards.add(j, card2Sort);
break;
} else {
//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
* NO TRUMP CDHS
* TRUMP Map to Z for trump
* suite order less C D H S higher
* value suit less 0 1 2 3 4 5 6 7 8 9 A J K Q
* map 10 to A
* J to B
* Q to C
* K to D
* A to E
*/
private static int beforeOrAfter2Trump(String wordA, String wordB, char trump) {
//System.out.print("word "+wordA+" "+wordB+" "); // debug
char charA = wordA.charAt(wordA.length()-1);
char charB = wordB.charAt(wordB.length()-1);
//System.out.println(wordA+" "+wordB+" End "+charA+" "+charB+" "); // debug
// remap char for TRUMP
// mapping charA to correct order
if (charA==trump) {
charA='Z';
}
// mapping charB to correct order
if (charB==trump) {
charB='Z';
}
if (charA<charB) {
return -1;
} else if (charA>charB) {
return 1;
} else {
// equal
charA = wordA.charAt(wordA.length()-2);
charB = wordB.charAt(wordB.length()-2);
// mapping charA to correct order
if (charA=='0') {
charA='A';
} else if (charA=='J') {
charA='B';
} else if (charA=='Q') {
charA='C';
} else if (charA=='K') {
charA='D';
} else if (charA=='A') {
charA='E';
}
// mapping charB to correct order
if (charB=='0') {
charB='A';
} else if (charB=='J') {
charB='B';
} else if (charB=='Q') {
charB='C';
} else if (charB=='K') {
charB='D';
} else if (charB=='A') {
charB='E';
}
//System.out.println(" First "+charA+" "+charB); // debug
if (charA<charB) {
return -1;
} else if (charA>charB) {
return 1;
}
}
return 0;
}
}