Well, you've already broken your hand up into suits and ranks, that's a good start. Now you just need to retain that info after you do print your output.
For a flush, by far the easiest solution is to take a histogram of the suits. If the entry for any one suit is 5, you have a flush.
I don't know java, but the c++ would be something like:
// vRanks is your array of
enum ESuit { eS_HEARTS, eS_DIAMONDS, eS_CLUBS, eS_SPADES, eS_LAST };
size_t vSuitCount[eS_LAST];
memset(vSuitCount, 0, sizeof vSuitCount);
for (unsigned i = 0; i < 5; ++i)
++vSuitCount[vRanks[i]];
bool bFlush = false;
for (unsigned i = 0; i < eS_LAST; ++i)
{
if (vSuitCount[i] == 5)
{
bFlush = true;
break;
}
}
Furthermore, in addition to having the normally ordered rank histogram, I'd also have a 2nd one that is sorted in descending order so that you can easily find what the highest numbers of the same card number are in the hand. I'd do the same with the suits, because then testing for a flush is cake.
So, lets start at the bottom:
Two of a kind: index 0 of sorted ranks is 2, index 1 is 1, and index 0 of the sorted suits is any rank is 2, index 1 is 1
Two pair: indices 0 and 1 of the sorted ranks is 2
Three of a kind: index 0 of the sorted ranks is 3, index 1 is 1
Straight: using the unsorted rank histogram,
1) any run of 5, starting between ace and 9, is all 1 or
2) the run from 10 to K are all 1, and ace is 1
Flush: index 0 of the sorted suits is 5
Full House: index 0 of the sorted ranks is 3 and index 1 is 2
Four of a kind: index 0 of sorted ranks is 4
Straight Flush: Straight and Flush
Royal Flush: Straight and Flush, in ordered ranks 10 and K are both 1
An example:
After running your histogram, you have this:
Rank
Ace 0
2 0
3 0
4 2
5 0
6 0
7 0
8 0
9 0
10 3
J 0
Q 0
K 0
Then, your second, sorted version of the ranks would be like this:
3
2
0
0
0
0
0
0
0
0
0
0
0
The test for a full house is just:
bool bFullHouse = (vSortedRanks[0] == 3) && (vSortedRanks[1] == 2);
Good luck!