change
change

Reputation: 3568

contains function linkedlist

public class state implements Comparator<state>{
        Point a;
        Point b;
        private int path_cost=0;
        ...
}

    class Point {
        int x;
        int y;
        ...
    }

for above i have:

PriorityQueue<state> openNode= new PriorityQueue<state>();
LinkedList<state> closed =new LinkedList<state>();
state currNode;

I need to check if the Point a of ANY openNode or closed equals currNode's Point a.

I could use contains if i had to match the entire object but here i just care about one variabale (Point a) of state class. I want the method to check all the nodes in PriorityQueue and LinkedList.

addition: I am thinking about using Iterator on my priorityQueue and LinkedList. But i am not sure how to read the value of Point a using Iterator.

Upvotes: 3

Views: 1175

Answers (3)

change
change

Reputation: 3568

i used method overriding on function equals for both the object and achieved my result.

       class Point {
            int x;
            int y;
            ...

    @Override
    public boolean equals(Object other){
        if (other == null) return false;
        if (other == this) return true;
        if (!(other instanceof Point))return false;
        Point otherPoint = (Point)other;
        return (this.x==otherPoint.getX() && this.y==otherPoint.getY() )? true : false;
    }

        }



public class state implements Comparator<state>{
            Point a;
            Point b;
            private int path_cost=0;
            ...
    @Override
    public boolean equals(Object other){
        if (other == null) return false;
        if (other == this) return true;
        if (!(other instanceof state))return false;
        state otherState = (state)other;
        return ((this.a).equals(otherState.a))? true : false;
    }
    }

Upvotes: 0

Jon Skeet
Jon Skeet

Reputation: 1502526

EDIT: Looked like I'd misunderstood slightly. It's simpler than I thought.

// I've assumed more conventional names
Point currPoint = currNode.getPointA();
for (State openNode : openNodes) {
    if (openNode.getPointA().equals(currPoint)) {
        return true;
    }
}

for (State closedNode : closedNodes) {
    if (closedNode.getPointA().equals(currPoint)) {
        return true;
    }
}
// No matching points
return false;

You could potentially use Guava's Iterables.concat() method to make this slightly simpler:

for (State node : Iterables.concat(closedNodes, openNodes)) {
    if (node.getPointA().equals(currPoint)) {
        return true;
    }
}
return false;

If you need to know which node has an equal point A, just change it to:

for (State node : Iterables.concat(closedNodes, openNodes)) {
    if (node.getPointA().equals(currPoint)) {
        return node;
    }
}
return null;

That will only find one such node, of course - there may be multiple matches.

Upvotes: 2

Amit Deshpande
Amit Deshpande

Reputation: 19185

You will have to either provide equals method on Point a for state class or just use simple iteration and iterate over both List for comparison. contains method does the same.

If you use any other method it will be time consuming.

Very odd method is use Comparator to check equality

 class PointAComparator implements Comparator<State>

{
    Point p = null;
    public PointAComparator(Point a) {
        p = a;
    }
    @Override
    public int compare(State o1, State o2) {
        return (p.x == o1.a.x && p.y == o1.a.y) ? 1
                : (p.x == o2.a.x && p.y == o2.a.y) ? 1 : -1;
    }
}

Above compare method returns 1 for equal else -1 so when you do sorting then each list will have elements at the start which are equal. and then you can check for first element.

Upvotes: 0

Related Questions