Java - Как добавить элементы в список массивов в порядке возрастания и подсчитать количество пар в списке массивов? - PullRequest
2 голосов
/ 19 марта 2020

Как и в моем предыдущем посте, я пытаюсь разработать карточную игру, в которой:

a) Распечатывает всю колоду карт

b) Добавляет 10 случайных карт в порядке возрастания список массивов

c) Подсчитывает количество пар в этом списке массивов

В классе SimpleCardGame2 есть 2 метода, с которыми у меня возникают проблемы которые относятся к частям b и c.

личное состояние c void addCard (карты ArrayList, карта c) - это метод, который добавляет Card c в cards.cards и карты должны быть расположены от маленького к большому. Когда новая карта вставлена, определите правильную позицию, чтобы список поддерживал отсортированный порядок. Я попытался использовать метод .ordinal () для сравнения элементов, но я получаю сообщение об ошибке: Поле Card.rank не отображается .

Далее private stati c int numPairs (карты ArrayList) - это метод, который подсчитывает количество пар карт в карточках . Две карты в паре, если они одного ранга. Три карты одинакового ранга в картах считаются одной парой. Есть две пары карт, если все четыре карты одного ранга находятся в картах. Мои проблемы здесь заключаются в том, что я не уверен, как считать 3 карты такого же ранга, как 1 пара, с кодом, который я написал, и что ошибка говорит: Поле Card.rank не отображается все еще показывает вверх, потому что я использую метод .ordinal () для сравнения рангов карт.

Как исправить эти ошибки и мой код для этих двух конкретных методов?

import java.util.ArrayList;

public class SimpleCardGame2 {
  private static void addCard(ArrayList<Card> cards, Card c) {
        for (int x=0; x<10; x++) {
            if (cards.get(x) < c.rank.ordinal()) {
                continue;
            }
            if (cards.get(x) == c.rank.ordinal()) {
                return;
            }
            cards.add(x,c);
            return;
        }
        cards.add(c);
   }

  private static int numPairs(ArrayList<Card> cards) {
        int count=0;
        for (int j=0; j<10; j++) {
            for (int k=j+1; k<10; k++) {
                if (cards.get(j).rank.ordinal() == cards.get(k).rank.ordinal()) {
                    count+=1;
                }
            }
        }
        return count;
   }

  public static void main(String[] args) {

    ArrayList<Card> deck;  // an arraylist of Cards, representing a deck of cards

    // put a copy of each card into cards
    // The order of the cards in the array is: 
    // S2, S3, ..., SK, H2, ..., HK, C2, ..., CK, D2, ..., DK

    deck = new ArrayList<Card>();
    for (Suit s : Suit.values()) {
        for (Rank r : Rank.values()) {
            deck.add(new Card(r,s));
        }
    }

    //
    // YOU DO NOT HAVE TO MODIFY ANYTHING BELOW
    //

    // print out the whole deck once
    System.out.println("The whole deck is:");
    System.out.println(deck);

    // randomly draw 10 cards
    // cards drawn will be removed from deck 
    MyRandom rnd = new MyRandom();
    ArrayList<Card> cards = new ArrayList<Card>();
    for (int i = 0; i < 10; i++)
      addCard(cards, deck.remove(rnd.nextInt(deck.size())-1));


    // print out the card drawn and the number of pairs
    System.out.print("The cards drawn are: ");
    System.out.println(cards);
    System.out.print("There are ");
    System.out.print(numPairs(cards));
    System.out.println(" pair(s) of cards.");
  }
}
public class Card {
    private Rank rank;
    private Suit suit;

    public Card (Rank rank, Suit suit) {
        this.rank = rank;
        this.suit = suit;
    }

    public String toString() {
        return suit + "" + rank;
    }

    public int compareTo(Card c) {
        int diffRank = rank.ordinal() - c.rank.ordinal();
        if (diffRank < 0) {
            return -1;
        }
        else if (diffRank > 0) {
            return 1;
        }
        else if (diffRank == 0) {
            int diffSuit = suit.ordinal() - c.suit.ordinal();
            if (diffSuit < 0) {
                return -1;
            }
            else if (diffSuit > 0) {
                return 1;
            } 
        }
        return 0;
    }
}

public enum Rank {
  TWO("2"), 
  THREE("3"), 
  FOUR("4"), 
  FIVE("5"), 
  SIX("6"), 
  SEVEN("7"), 
  EIGHT("8"),
  NINE("9"), 
  TEN("10"), 
  JACK("J"), 
  QUEEN("Q"), 
  KING("K"),
  ACE("A"); 

  private String rank;

  // Constructor
  Rank (String r) {
    rank = r;
  }

  public String toString() {
    return rank;
  }
}

public enum Suit {
    SPADE("S"), 
    HEART("H"), 
    CLUB("C"), 
    DIAMOND("D"); 

    private String suit;

    Suit (String s) {
      suit = s;
    }

    public String toString() {
      return suit;
    }
}
import java.util.Random;

public class MyRandom {

  Random rnd;

  public MyRandom() {
//    rnd = new Random(180);
    rnd = new Random();
  }

  // generate a random integer from 1 to max
  public int nextInt(int max) {
    return rnd.nextInt(max) + 1;
  }
}

Вот предполагаемые результаты правильной программы:

The whole deck is:
[S2, S3, S4, S5, S6, S7, S8, S9, S10, SJ, SQ, SK, SA, H2, H3, H4, H5, H6, H7, H8, H9, H10, HJ, HQ, HK, HA, C2, C3, C4, C5, C6, C7, C8, C9, C10, CJ, CQ, CK, CA, D2, D3, D4, D5, D6, D7, D8, D9, D10, DJ, DQ, DK, DA]
The drawn cards are: [D4, D5, S9, C10, DQ, CQ, HQ, SQ, HK, SA]
There are 2 pair(s) of cards.

The whole deck is:
[S2, S3, S4, S5, S6, S7, S8, S9, S10, SJ, SQ, SK, SA, H2, H3, H4, H5, H6, H7, H8, H9, H10, HJ, HQ, HK, HA, C2, C3, C4, C5, C6, C7, C8, C9, C10, CJ, CQ, CK, CA, D2, D3, D4, D5, D6, D7, D8, D9, D10, DJ, DQ, DK, DA]
The drawn cards are: [D2, D5, H9, S9, H10, HJ, DK, HK, SK, CA]
There are 2 pair(s) of cards.

Ответы [ 2 ]

2 голосов
/ 19 марта 2020

Причиной первой ошибки является то, что переменная rank в классе Card имеет значение private (доступно только из класса Card). Для этого есть два возможных решения:

  1. Сделать это public (доступно везде). Это может быть невыгодно, потому что это также означает, что ранг может быть изменен из любой точки вашей программы, но его легче реализовать, и я не думаю, что это станет для вас проблемой:
public class Card {
    public Rank rank;
    …
}
Добавить public функцию получения, которая будет разрешать только чтение, но не изменять значение:
public class Card {
    private Rank rank;
    …
    public Rank getRank() {
        return rank;
    }
}

В последнем варианте вам также придется изменить доступ с c.rank на c.getRank().

По поводу вашей второй проблемы: я думаю, что было бы проще всего просто сосчитать вхождение каждого ранга и разделить его на два, так что вы получите для каждого ранга количество пар, затем вы можете подвести итог, и все готово:

int pairs = 0;
for (Rank r : Rank.values()) {
    int cardsWithThisRank = 0;
    for(Card c : cards) {
        if(c.rank == r) { // Or c.getRank() if you chose the second option above.
            cardsWithThisRank++;
        }
    }
    int pairsWithThisRank = cardsWithThisRank/2;
    pairs += pairsWithThisRank;
}
return pairs;
2 голосов
/ 19 марта 2020

Я бы создал ArrayList для каждого из рангов. Затем выполните итерацию по вытянутым картам и скопируйте каждую карту в соответствующий список рангов. Затем вам нужно проверить размер каждого рангового массива: если размер 2 или больше, он содержит пару. Подсчитайте количество массивов, которые имеют размер 2 или больше, и вы знаете количество пар.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...