【问题标题】:How to return (and remove) an object from an arraylist in java based on a condition of that objectjava - 如何根据对象的条件从java中的arraylist中返回(和删除)对象
【发布时间】:2015-05-06 19:34:21
【问题描述】:

为了上课,我需要做一个纸牌游戏(桥牌)。

我有一个 Card 类,它定义了一张卡片的所有属性,还有一个 Deck 类,它生成了 52 张卡片。还有一个 Hand 类,可以将牌组中的牌随机分配给四手牌。

现在我需要创建一个方法,将玩家的手牌和目标花色作为输入,并返回该花色中排名最高的牌。我有:

private Card highestRankofSuit(ArrayList<Card> hand, char suit)
{
    ArrayList<Card> cardsOfSuit = null;
    for(int i = 0; i < hand.size(); i++)
    {
        if (hand.get(i).getSuit() == suit)
        {
            cardsOfSuit.add(hand.get(i));
        }
    }
    return cardsOfSuit(max(Card.getBridgeRank()));  //This is wrong because it only returns one int

}

我该怎么做才能退回所需的卡?此外,我还需要知道如何从 ArrayList 中删除特定的 Card 对象(基于 Card 的等级和花色等信息,但事先不知道它在 ArrayList 中的位置)。

第一次在这里发帖,感谢大家的帮助!

【问题讨论】:

  • 请包含更多代码,例如您的.getBridgeRank() 函数。就目前而言,这个问题还不清楚。
  • 知道要移除的卡片的条件,为什么不能遍历支持每手牌的 ArrayList 并搜索符合条件的卡片?一旦找到它,您就知道 ArrayList 中的位置,然后可以使用 remove() 方法。对吗?
  • ArrayList 有一个 remove(Object) 方法,用于删除对象的第一个实例。但请确保您已覆盖 Card 的 equals() 方法,因为 remove() 会删除列表中的对象,即“.equals()”是您提供给 remove() 方法的参数。此方法返回一个布尔值,让您知道它是否找到并删除了指定的对象。

标签: java arraylist


【解决方案1】:

要返回相关卡片,您需要遍历该套装中的所有卡片并找到最大的一张,以及该最大卡片的索引。一旦你检查了所有这些,返回价值最高的卡。我认为这就是您想要的(因为您还没有提供所有代码)。

int max = -1;
int maxCardIndex = -1;
int i;
for(i = 0; i < cardsOfSuit.size(); i++) {
    int cardVal = cardsOfSuit.get(i).getBridgeRank();
    if( cardVal > max) {
       maxCardIndex = i;
    }
}
return cardsOfSuit.get(maxCardIndex);

移除一张卡片,只需遍历手中的所有卡片并检查卡片的详细信息,然后在满足您的要求时将其移除。 (您需要更新它,但它提供了一个示例)。

for(int i = 0; i < hand.size(); i++) {
    Card currentCard = hand.get(i);
    /* Check for what conditions you want to match in this if statement */
    if(currentCard.foo = "bar") {
       hand.remove(i);
    }
}

【讨论】:

    【解决方案2】:
    private Card highestRankofSuit(ArrayList<Card> hand, char suit){
      ArrayList<Card> cardsOfSuit = null;
      int maxIndex = 0;
      int maxCardNum = 0;
    
    for(int i = 0; i < hand.size(); i++)// for loop1{
                if (hand.get(i).getSuit() == suit) {
                    if(hand.get(i).getNumberOnCard() > maxCardNum){
                          maxIndex = i;
                          maxCardNum = hand.get(i).getNumberOnCard();
                    }
                }
            }
    return hand.get(maxIndex);
    
    }
    
    • 检查卡片的花色是否正确
    • 检查其数量是否高于当前找到的最大数量
    • 如果是:保存手牌的索引ArrayList AND 保存卡上数字的值,以便与下一张卡进行比较

    【讨论】:

      【解决方案3】:

      我要进行的第一个更改是使用一个 for-each 循环,该循环遍历 arraylist,这样您就不必进行如此多的 get 调用。我们真的需要看看 getBridgeRank() 方法做了什么。您还想使用 Math.max() 方法还是您自己的 max 方法?

      private Card highestRankofSuit(ArrayList<Card> hand, char suit)
      {
          ArrayList<Card> cardsOfSuit = null;
          for(Card c : habd)
          {
              if (c.getSuit() == suit)
                  cardsOfSuit.add(c);
          }
          return cardsOfSuit(max(Card.getBridgeRank())); 
      }
      

      【讨论】:

        【解决方案4】:

        如果您使用的是 java 8,请查看 java.util.Stream

        private Card highestRankofSuit(ArrayList<Card> hand, char suit) {
                Optional<Card> max = hand.stream().
                        filter(card -> card.getSuit() == suit).
                        max((o1, o2) -> Integer.compare(o1.getBridgeRank(), o2.getBridgeRank()));
        
                return max.orElse(null); //may return null
        }
        

        用于移除符合条件的卡片(不需要 java 8)

        Iterator<Card> iterator = hand.iterator();
                while (iterator.hasNext()) {
                    Card card =  iterator.next();
                    //Change the following condition depending on your needs
                    if(card.getSuit()=='I'){
                        iterator.remove();
                    }
                }
        

        如果您已经拥有要移除的卡片,您可以使用ArrayList#remove(Object)

        hand.remove(cardToRemove);
        

        【讨论】:

          猜你喜欢
          • 2015-11-15
          • 2011-10-02
          • 2015-08-05
          • 1970-01-01
          • 2013-01-26
          • 1970-01-01
          • 2012-10-30
          • 1970-01-01
          • 2010-11-21
          相关资源
          最近更新 更多