Why am I getting this error? “bad operand types for binary operator '>'”

眉间皱痕 提交于 2019-12-01 09:41:59

问题


I would like to know what it causing the error of "bad operand types for binary operator '>'" down below I have the codes for both my Hand and Card classes. I've also specified the lines that are causing the error. Thanks for the help. This is for a BlackJack project.

Hand Class

import java.util.Vector;

public class Hand {

private Vector hand;   // The cards in the hand.

public Hand() {
       // Create a Hand object that is initially empty.
  hand = new Vector();
}

public void clear() {
     // Discard all the cards from the hand.
  hand.removeAllElements();
}

public void addCard(PlayingCard c) {
     // Add the card c to the hand.  c should be non-null.  (If c is
     // null, nothing is added to the hand.)
  if (c != null)
     hand.addElement(c);
}

public void removeCard(PlayingCard c) {
     // If the specified card is in the hand, it is removed.
  hand.removeElement(c);
}

public void removeCard(int position) {
     // If the specified position is a valid position in the hand,
     // then the card in that position is removed.
  if (position >= 0 && position < hand.size())
     hand.removeElementAt(position);
}

public int getCardCount() {
     // Return the number of cards in the hand.
  return hand.size();
}

public PlayingCard getCard(int position) {
      // Get the card from the hand in given position, where positions
      // are numbered starting from 0.  If the specified position is
      // not the position number of a card in the hand, then null
      // is returned.
  if (position >= 0 && position < hand.size())
     return (PlayingCard)hand.elementAt(position);
  else
     return null;
}

 public void sortBySuit() {
     // Sorts the cards in the hand so that cards of the same suit are
     // grouped together, and within a suit the cards are sorted by value.
     // Note that aces are considered to have the lowest value, 1.
  Vector newHand = new Vector();
  while (hand.size() > 0) {
     int pos = 0;  // Position of minimal card.
     PlayingCard c = (PlayingCard)hand.elementAt(0);  // Minumal card.


    for (int i = 1; i < hand.size(); i++) {
        PlayingCard c1 = (PlayingCard)hand.elementAt(i);

        *if ( c1.getCardFace() > c.getCardFace() ||
                (c1.getCardFace().equals(c.getCardFace()) && c1.getFaceValue() < c.getFaceValue()) ) {*
            pos = i;
            c = c1;
        }
     }
     hand.removeElementAt(pos);
     newHand.addElement(c);
  }
  hand = newHand;
}

public void sortByValue() {
     // Sorts the cards in the hand so that cards of the same value are
     // grouped together.  Cards with the same value are sorted by suit.
     // Note that aces are considered to have the lowest value, 1.
  Vector newHand = new Vector();
  while (hand.size() > 0) {
     int pos = 0;  // Position of minimal card.
     PlayingCard c = (PlayingCard)hand.elementAt(0);  // Minumal card.
     for (int i = 1; i < hand.size(); i++) {
        PlayingCard c1 = (PlayingCard)hand.elementAt(i);

        *if ( c1.getFaceValue() < c.getFaceValue() ||
                (c1.getFaceValue() == c.getFaceValue() && c1.getCardFace() > c.getCardFace()) ) {*
            pos = i;
            c = c1;
        }
     }
     hand.removeElementAt(pos);
     newHand.addElement(c);
  }
  hand = newHand;
}

 }

The error is in the hand class in the lines

if ( c1.getCardFace() > c.getCardFace() ||
                (c1.getCardFace().equals(c.getCardFace()) &&     c1.getFaceValue() < c.getFaceValue()) ) {

and

if ( c1.getFaceValue() < c.getFaceValue() ||
                (c1.getFaceValue() == c.getFaceValue() && c1.getCardFace() > c.getCardFace()) ) {

This is the Card Class

public class PlayingCard
{
// Instance Data - all things common to all cards
private String cardFace; // king, q, j, 10 - 2, A
private int faceValue; // numberic value of the card
private char cardSuit; // hold suit of the card
private char suits[] = {(char)(003), (char)(004), (char)(005), (char)(006)};

// Constructor
public PlayingCard(int value, int suit)
{
    faceValue = value;
    setFace();
    setSuit(suit);
}

// helper setFace()
public void setFace()
{
    switch(faceValue)
    {
        case 1:
            cardFace = "A";
            faceValue = 14;
            break;
        case 11:
            cardFace = "J";
            break;
        case 12:
            cardFace = "Q";
            break;
        case 0:
            cardFace = "K";
            faceValue = 13;
            break;
        default:
            cardFace = ("" + faceValue);
    }
}

public void setSuit(int suit) // suit num between 0 and 3
{
    cardSuit = suits[suit];
}

// other helpers
public int getFaceValue()
{
    return faceValue;
}
public String getCardFace()
{
    return cardFace;
}

public String toString()
{
    return (cardFace + cardSuit);
}
 }

回答1:


getCardFace() returns a String. < and > operators exist only for numeric types.

You can use c1.getCardFace().compareTo(c.getCardFace()) < 0 or c1.getCardFace().compareTo(c.getCardFace()) > 0 instead, to compare the Strings according to their natural ordering.

if ( c1.getCardFace() > c.getCardFace() ||
                (c1.getCardFace().equals(c.getCardFace()) &&     c1.getFaceValue() < c.getFaceValue()) ) {

would become

if ( c1.getCardFace().compareTo(c.getCardFace()) > 0 ||
                (c1.getCardFace().equals(c.getCardFace()) &&     c1.getFaceValue() < c.getFaceValue()) ) {

and

if ( c1.getFaceValue() < c.getFaceValue() ||
                (c1.getFaceValue() == c.getFaceValue() && c1.getCardFace() > c.getCardFace()) ) {

would become

if ( c1.getFaceValue() < c.getFaceValue() ||
                (c1.getFaceValue() == c.getFaceValue() && c1.getCardFace().compareTo(c.getCardFace()) > 0) ) {



回答2:


getCardFace() is returning String value but you can't use < , > , <= or >= for comparing String.




回答3:


Don't use these operators <,> and == to compare two Strings, instead use compareTo method.

From Javadoc:

public int compareTo(String anotherString)

Compares two strings lexicographically. The comparison is based on the Unicode value of each character in the strings. The character sequence represented by this String object is compared lexicographically to the character sequence represented by the argument string. The result is a negative integer if this String object lexicographically precedes the argument string. The result is a positive integer if this String object lexicographically follows the argument string. The result is zero if the strings are equal; compareTo returns 0 exactly when the equals(Object) method would return true.

An example of comparing two Strings

String s1="example1", s2="example2";
if ( s1.compareTo(s2) > 0 )
     System.out.println("First string is greater than second.");
else if ( s1.compareTo(s2) < 0 )
      System.out.println("First string is smaller than second.");
else   
      System.out.println("Both strings are equal.");

Note: The compareTo method is case sensitive i.e "java" and "Java" are two different strings if you use compareTo method. String "java" is greater than "Java" as ASCII value of 'j' is greater than 'J'. If you wish to compare strings but ignoring the case then use compareToIgnoreCase method.

public int compareToIgnoreCase(String str)

Compares two strings lexicographically, ignoring case differences. This method returns an integer whose sign is that of calling compareTo with normalized versions of the strings where case differences have been eliminated by calling Character.toLowerCase(Character.toUpperCase(character)) on each character.



来源:https://stackoverflow.com/questions/30374296/why-am-i-getting-this-error-bad-operand-types-for-binary-operator

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!