Java-给出数组中的字符串值,并按数字从最低到最高排序

时间:2014-03-02 22:14:43

标签: java arrays string hashtable

好的,所以我有一个卡片项目的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我确定我错过了一些非常明显的东西......

4 个答案:

答案 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();
        }
    }

}