【问题标题】:Sorting in Java [duplicate]Java中的排序[重复]
【发布时间】:2011-04-02 16:47:49
【问题描述】:

可能重复:
Selection Sorting String Arrays (Java)

我有一张卡片清单

clubsArray = {TC, KC, 7C, AC}

这些代表(梅花 10、梅花王、梅花 7 和梅花 A) 我想知道如何对它们进行排序并获得这样的输出,

AC、KC、TC、7C

我尝试这样做以对其进行排序......

private String clubsOutput = "";
    public void clubsSort()
        {
          String order = {"A","K","Q","T","9","8","7","6","5","4","3","2","1"};
            for (int i = 0; i < clubsArray.length; i++)
            {
                temp = clubsArray[i].charAt(0); // Gets the value of the card 
                tempS = Character.toString(temp); // Holds the character
for (int x = 0; x < order.length; x ++)
{
if (tempS.equals(order[x])
{
clubsOutput = clubsOutput + clubsArray[i]+ " , "; 
}
}

我似乎无法解决这个问题

【问题讨论】:

  • ...是同一个人问的?原来的答案有什么问题?

标签: java arrays string sorting


【解决方案1】:

您正在使用字符串来完成这项工作。这似乎不是一个好方法,我建议你有一个自己的类型,比如

public class Card implements Comparable<Card>
{
  public enum Suit { SPADE, HEART, DIAMOND, CLUBS };
  public enum Value { ACE, TWO, THREE, ... };

  private Suit suit;
  private Value value;

  Card(Suit suit, Value value} { this.suit = suit; this.value = value };

  public String toString()
  {
    // return string representation like you want eg TC KC 7C
    // you can have enums with string parameters too
  }

  public int compareTo(Card card)
  { 
    // this is where you define the custom sorter
    // take a look to Comparable interface in Java API doc
    // basically this:
    //   return 0 if two cards are equal
    //   return 1 if this card is greater than passed one
    //   return -1 otherwise
  }
}

一旦您定义了卡片与其他卡片相比的排序方式,您就可以让 Java API 完成这项繁琐的工作:

Card[] array = new Card[]{TC, KC, 7C, AC};
Arrays.sort(array);

在 Java 中应该是这样的。

枚举的好处是您可以按照正确的排序顺序定义它们,然后直接比较它们,这样您就可以执行以下操作:

public int compareTo(Card card) {
  int sc = suit.compareTo(card.suit);

  if (sc != 0)
    return sc;
  else
    return value.compareTo(card.value);
}

【讨论】:

    【解决方案2】:

    一个简单的方法是让它成为一个实现 Comparable 接口的对象。

    然后您可以获取 Card 对象的列表并使用 Collections.sort

    http://download.oracle.com/javase/1.5.0/docs/api/java/util/Collections.html#sort(java.util.List)

    public class Card implements Comparable {
        String card;
    
        public compareTo(Object o) {
            if (o instanceof Card) {
                // check equal
                if (o.card.charAt(0) == this.card.charAt(0)) return 0; 
                // continue logic, returning -1 for lesser values and 1 for greater values               
    
            }
        }
    }
    

    【讨论】:

      【解决方案3】:
      ArrayList<String> list = 
          new ArrayList<String>(Arrays.asList("TC", "KC", "7C", "AC"));
      Collections.sort(list);
      

      如果自然顺序不是您想要的,您可以定义自己的 Comparator 类并将其传入:

      Collections.sort(list, myComparator);
      

      【讨论】:

        【解决方案4】:

        如果您的卡片总是由 2 个字符串表示,您可以使用如下内容:

        List<String> cards = new ArrayList<String>();
        cards.add("TC");
        cards.add("KC");
        cards.add("7C");
        cards.add("AC");
        
        Collections.sort(cards, new Comparator<String>() {
            public int compare(String o1, String o2) {
                int i1 = "AKQT98765432".indexOf(o1.charAt(0));
                int i2 = "AKQT98765432".indexOf(o2.charAt(0));
                return i1 == i2 ? 0 : i1 < i2 ? -1 : 1;
            }
        });
        
        for (String card : cards) {
            System.out.println(card);
        }
        

        【讨论】:

          【解决方案5】:

          您似乎正在为卡身份使用枚举。如果是这种情况,您的卡片有一个自然顺序,即声明枚举成员的顺序。如果您的枚举名为“Card”,您可以声明一个List cardList; 并调用Collections.sort(cardList) 对其进行排序。

          这是一个演示该技术的方法:

           公共静态 void main(
                字符串 [] 参数)
              {
                  列表 cardList = new LinkedList();
          
                  cardList.add(Card.CA);
                  cardList.add(Card.CQ);
                  cardList.add(Card.C7);
                  cardList.add(Card.CJ);
          
                  Collections.sort(cardList);
          
                  对于(卡当前:cardList)
                  {
                      System.out.println(current);
                  }
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-11-04
            • 2011-12-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多