Robert
Robert

Reputation: 143

Java counter not counting properly

Hi I'm very new to Java and have this HW problem, we are asked to build Class LTile, a tile in the game of Scrabble. The ID number of a tile should be assigned by a class/static data member, which keeps track of the number of LTile objects produced. My ID output didn't not print from 1 to 26, instead, they are all assign 26. I suspect my ID attribute must be wrong, but couldn't figure out the exactly error. Any help is greatly appreciated! Thanks!

package hw2;

    public class LTile {
        char letter;
        private int value;
        private static int ID=0;

        public LTile(){
        this.letter = '?';
        this.value = 0;
        LTile.ID++;
        }
        public LTile(char letter, int value){
            this.letter=letter;
            this.value=value;
            LTile.ID++;
        }
        public char getLetter(){
            return this.letter;
        }
        public int getValue(){
            return this.value;
        }
        public int getID(){
            return LTile.ID;
        }
        public boolean equals(Object obj){
            if(this ==obj){
                return true;}
            else{
                return false;
            }
        }

        public String toString(){
            return "["+ID+":" + letter+","+value+"]";
        }
          //**
          //** main() for testing LTile
          //**
          public static void main(String[] args)
          {
            final String letters = "EAIONRTLSUDGBCMPFHVWYKJXQZ";
            final int[] values  =  {1,1,1,1,1,1,1,1,1,1,2,2,3,3,3,3,4,4,4,4,4,5,8,8,10,10};

            java.util.List<LTile> lst = new java.util.ArrayList<LTile>();
            for (int i = 0; i < letters.length(); ++i)
              lst.add(new LTile(letters.charAt(i), values[i]));

            for (LTile tile : lst)
              System.out.println(tile);
            System.out.println();

            // test for equals
            boolean found = false;
            for (int i = 0; i < lst.size()-1; ++i) {
              for (int j = i+1; j < lst.size(); ++j) {
                if (lst.get(i).equals(lst.get(j))) {
                  System.out.println("ERROR in equals() found for "
                      + lst.get(i) + " and " + lst.get(j));
                  found = true;
                }
              }
            }
            if (!found)
              System.out.println("No error in equals().");
          }
    }

My output is:
    [26:E,1]
    [26:A,1]
    [26:I,1]
    [26:O,1]
    [26:N,1]
    [26:R,1]
    [26:T,1]
    [26:L,1]
    [26:S,1]
    [26:U,1]
    [26:D,2]
    [26:G,2]
    [26:B,3]
    [26:C,3]
    [26:M,3]
    [26:P,3]
    [26:F,4]
    [26:H,4]
    [26:V,4]
    [26:W,4]
    [26:Y,4]
    [26:K,5]
    [26:J,8]
    [26:X,8]
    [26:Q,10]
    [26:Z,10]

    No error in equals()

    **The correct output should be:**
    [1: E,1]
    [2: A,1]
    [3: I,1]
    [4: O,1]
    [5: N,1]
    [6: R,1]
    [7: T,1]
    [8: L,1]
    [9: S,1]
    [10: U,1]
    [11: D,2]
    [12: G,2]
    [13: B,3]
    [14: C,3]
    [15: M,3]
    [16: P,3]
    [17: F,4]
    [18: H,4]
    [19: V,4]
    [20: W,4]
    [21: Y,4]
    [22: K,5]
    [23: J,8]
    [24: X,8]
    [25: Q,10]
    [26: Z,10]

    No error in equals().

Upvotes: 1

Views: 523

Answers (1)

Anderson Vieira
Anderson Vieira

Reputation: 9049

The ID number of a tile should be assigned by a class/static data member, which keeps track of the number of LTile objects produced.

This means that the id value should come from a static data member, not that it should be a static data member. So you need two fields: an instance id field to keep the object's id and a static CURRENT_ID field to keep track of how many objects you have created so far.

public class LTile {
    char letter;
    private int value;
    private int id; // instance id
    private static int CURRENT_ID = 0; // static counter from where the instance ids will be drawn

    public LTile() {
        // Call the other constructor to avoid unnecessary repetition
        this('?', 0);
    }

    public LTile(char letter, int value) {
        this.letter = letter;
        this.value = value;
        this.id = LTile.CURRENT_ID++;
    }

    // rest of the code

    public int getID() {
        return this.id;
    }

    public String toString() {
        return "["+this.id+":" + this.letter+","+this.value+"]";
    }
}

Note you also need to change getId() and toString() to use the instance id instead of the static counter.

Upvotes: 3

Related Questions