简体   繁体   中英

.equals() not evaluating to proper boolean

public class SparseMatrix {
    private final TreeMap<Integer,TreeMap<Integer,Double>> matrix;
    private final int rows;
    private final int cols;

    public SparseMatrix(int r, int c) {
        // Creates instances for matrix objects
        this.matrix = new TreeMap<>();

        // Assigns the matrix a number of rows and a number of columns
        this.rows = r;
        this.cols =  c;
    }

    public TreeMap<Integer, TreeMap<Integer, Double>> getMatrix() {
        return matrix;
    }

    public static boolean equals(SparseMatrix a, SparseMatrix b) {
        if (a.getMatrix().equals(b.getMatrix()) == true) {
            return true;
        }
        else {
            return false;
        }
    }
}

Keys and values are inputted by the user then there's a test driver to make sure it works right, but it's not evaluating the matrices right. It tells me true every time. I'm assuming it's the == true and the equals comparator. It returns true if all the keys and values of both matrices are equal.

"new" command:

if (cmd.equals("new")) {
    String name = input.next();
    int rows = input.nextInt();
    int cols = input.nextInt();
    if (rows < 1 || cols < 1) {
        System.out.println("new: rows and/or cols less than 1: ");
        System.exit(1);
    }

    SparseMatrix m = new SparseMatrix(rows,cols);
    int i = input.nextInt();
    while (i >= 0) {
        int j = input.nextInt();
        double v = input.nextDouble();
        m.set(i,j,v);
        i = input.nextInt();
    }
    matrix.put(name,m);
    System.out.printf("new %s = %s\n", name, m);
}

The test driver part is:

String a = input.next();
if (!matrix.containsKey(a)) {
    System.out.println("equals: no such matrix: " + a);
    System.exit(1);
}
String b = input.next();

if (!matrix.containsKey(b)) {
    System.out.println("equals: no such matrix: " + b);
    System.exit(1);
}

System.out.printf("%s.equals(%s) = %b\n", a, b,
              SparseMatrix.equals(matrix.get(a),matrix.get(b)));

And the input looks like:

new name1 10 10 // new matrix with 10 rows and 10 columns
10 10 10.0 // int int double treemap
-1 // stops the input

Sounds like matrix.get(a) and matrix.get(b) returns the same TreeMap . Try to print the results to be sure.

As for comparisons, as long as the objects that you are trying to compare correctly overrides equals you can do this with the standard API:

public static boolean equals(SparseMatrix a, SparseMatrix b) {
    return matrix.get(a).equals(matrix.get(b));
}

I'm also a huge fan of libraries such as Apache Commons and Guava . Utility methods such as Commons Collections.isEqualCollection and Guava Maps.difference may come in handy.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM