好的,所以我有一个卡片项目的String数组 -
String[] rank = {"A","2","3","4","5","6","7","8","9", "J", "Q","K"};
String[] suit = {"H", "S", "D", "C"};
我不确定如何订购字符串“AK”(1-13)..我正在尝试使用Hashtable将“suit”和“rank”相乘(这已经创建了52“null”值。)
我无视“西装的等级”,就像7个黑桃的价值高于7个俱乐部(如果这是真的)哈哈。
我想这样做,当我打印哈希表时,它会显示“HA”,“H2”,“H3”等等。
任何指针?我可以(正确地)按照我试图去做的方式吗?顺便说一下,为我的经验道歉:D我确定我错过了一些非常明显的东西......
答案 0 :(得分:1)
首先:不要使用Hashtable
,它已经过时了。
第二:创建两个枚举;一个用于卡片“值”,另一个用于套件:
值:
public enum CardValue {
ONE("1"),
TWO("2"),
// etc
KING("king"),
ACE("ace")
;
private final String asString;
CardValue(final String asString)
{
this.asString = asString;
}
@Override
public String toString()
{
return asString;
}
}
套件:
public enum CardSuite
{
CLUBS,
DIAMONDS,
HEARTS,
SPADES
}
然后一张卡片:
public final class Card
implements Comparable<Card>
{
private final CardValue value;
private final CardSuite suite;
public Card(final CardValue value, final CardSuite suite)
{
this.value = value;
this.suite = suite;
}
@Override
public int hashCode()
{
return Objects.hashCode(value, suite);
}
@Override
public boolean equals(final Object obj)
{
if (obj == null)
return false;
if (this == obj)
return true;
if (getClass() != obj.getClass())
return false;
final Card other = (Card) obj;
return suite == other.suite
&& value == other.value;
}
@Override
public int compareTo(final Card o)
{
final int ret = suite.compareTo(other.suite);
return ret != 0 ? ret : value.compareTo(other.value);
}
@Override
public String toString()
{
return value + " of " + suite.toString().toLowerCase();
}
}
这实际上会为new Card(CardValue.KING, CardSuite.SPADES)
打印“黑桃王”;并且当Card
实施Comparable
时,您可以在每个.compareTo()
上使用new Card(CardValue.TWO, CardSuite.SPADES)
。在此实现中,两个黑桃(new Card(CardValue.JACK, CardSuite.CLUBS)
)被认为大于一个俱乐部(public enum { FOO, BAR }
)。
请注意,它依赖于枚举具有可比性,并且自然顺序基于其声明;也就是说:
FOO
BAR
被视为低于public enum { BAR, FOO }
;但在:
Card
恰恰相反。请参阅Enum
's .ordinal()
以了解原因。
另请注意,在.equals()
的{{1}}中,使用==
代替.equals()
来比较实例变量;这是因为所有实例变量都是枚举,枚举值都是单例。
答案 1 :(得分:0)
考虑实施Card助手类。然后,可以按优先顺序简单地枚举数组值,并通过Card类的方法访问。
答案 2 :(得分:0)
推荐卡片类:
public class Card{
/* these are the valid ranks and suits (both represented as Strings) */
protected final static String[] RANKS = {"Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King"};
protected final static String[] SUITS = {"Diamond", "Club", "Heart", "Spade" };
protected int rank;
protected String suit;
/* required methods for all cards to have */
public int getRank(){
return rank;
}
public String getSuit(){
return suit;
}
/* override Object's toString() */
public final String toString(){
return String.valueOf(this.getRank()) + String.valueOf(this.getSuit().charAt(0));
}
public Card(int rank, String suit){
this.rank = rank;
this.suit = suit;
}
public Card(String rank, String suit){
for(int r = 0; r < RANKS.length; r+=1){
if( rank.equals(RANKS[r]) ){
this.rank = r+1;
}
}
this.suit = suit;
}
}
会用它来定义卡片是什么。从这里你可以使用你选择的比较方法对它们进行排序。
答案 3 :(得分:0)
创建一个card
类,然后构建一个卡对象列表。您可以像其他人建议的那样使用enum
。
using System.IO;
using System;
using System.Collections.Generic;
public class Card
{
string rank;
string suit;
public Card(string s,string r)
{
rank = r;
suit = s;
}
public void print()
{
Console.WriteLine(suit+rank);
}
}
using System.IO;
using System;
using System.Collections.Generic;
class CardBuilder
{
static string[] rank = new string[]{"A","2","3","4","5","6","7","8","9", "J", "Q","K"};
static string[] suit = new string[]{"H", "S", "D", "C"};
public static List<Card> Cards;
static void Main()
{
// Read in every line in the file.
buildCardPack();
print();
}
public static void buildCardPack()
{
Cards = new List<Card>();
foreach(string s in suit)
{
foreach(string r in rank)
{
Cards.Add(new Card(s,r));
}
}
}
public static void print()
{
foreach(Card c in Cards)
{
c.print();
}
}
}