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

Isaac Hollis picture Isaac Hollis · May 21, 2015 · Viewed 26.6k times · Source

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);
}
 }

Answer

Eran picture Eran · May 21, 2015

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) ) {