Link to home
Start Free TrialLog in
Avatar of kilroyitt
kilroyitt

asked on

Java - Max/Min of X & Y Points

So I am having trouble figuring out why at this code can figure out the max/min of x with points but can only find the max of the y points.

I believe the code is somehow unreachable.. Here is the code:  
public Point[] extremes() {
		if (this.isEmpty())
			return null;

		// left, right , top, bottom
		Point left = null, right = null, top = null, bottom = null;
		Point returnArray[] = new Point[4];

		double xLeft = points[0].getX();
		double xRight = points[0].getX();
		double yUp = points[0].getY();
		double yDown = points[0].getY();
		
		for (int i = 1; i < size; i++) {
			if (points[i].getX() < xLeft) {
				xLeft = points[i].getX();
				left = points[i];
			} else if (points[i].getX() > xRight) {
				xRight = points[i].getX();
				right = points[i];
			}
		}
		
		
		for (int j = 1;j<size; j++) {
			
			if (points[j].getY() > yUp) {
				yUp = points[j].getY();
				top = points[j];
			} else if (points[j].getY() < yUp) {
				yDown = points[j].getY();
				bottom = points[j];
			}
		}
		
		
		returnArray[0] = left;
		returnArray[1] = right;
		returnArray[2] = top;
		returnArray[3] = bottom;
		
		
		
		
		
		return returnArray;
	}

Open in new window

Avatar of rockiroads
rockiroads
Flag of United States of America image

first glance is you never checked to see if it equalled yUp, you only check for greater than or less than

also, shouldn't your arrays start with 0?
Avatar of kilroyitt
kilroyitt

ASKER

Sorry I should have given more information about the problem, the array that is sent to this method is an array of points. Of those points I need to figure out which points are the highest/lowest on each axis. So the return array only needs to be 4 in length.

Comment to rocklroads: do you mean 0 for the for loops. I did that because wanted to initialize the points, so they could be compared.

*For this problem I do not need to worry about multiple points at the same height
In lines 27 & 30 you comparing to yUp on both lines. Line 30 should be comparing against yDown.
Also, why do it in two loops. You can just have the one loop and compare both X and Y in that loop!
I had it one for loop initially but decided to split it in hopes of troubleshooting the problem:
*I have also corrected that problem in line 30, but I am still having trouble getting the bottom most to become something else than null.


To test here are the point I have been using
[(3.0,1.0), (2.0,2.0), (4.0,2.0), (3.0,3.0)]

And the output:
leftmost point in square: (2.0,2.0)
rightmost point in square: (4.0,2.0)
highest point in square: (3.0,3.0)
lowest point in square: null

Here is the current updated code:
public Point[] extremes() {
		if (this.isEmpty())
			return null;

		// left, right , top, bottom
		Point left = null, right = null, top = null, bottom = null;
		Point returnArray[] = new Point[4];

		double xLeft = points[0].getX();
		double xRight = points[0].getX();
		double yUp = points[0].getY();
		double yDown = points[0].getY();
		
		for (int i = 0; i < size; i++) {
			if (points[i].getX() < xLeft) {
				xLeft = points[i].getX();
				left = points[i];
			} else if (points[i].getX() > xRight) {
				xRight = points[i].getX();
				right = points[i];
			}else if (points[i].getY() > yUp) {
				yUp = points[i].getY();
				top = points[i];
			} else if (points[i].getY() < yDown) {
				yDown = points[i].getY();
				bottom = points[i];
			}
		}
		
		
		returnArray[0] = left;
		returnArray[1] = right;
		returnArray[2] = top;
		returnArray[3] = bottom;
		
		
		
		
		
		return returnArray;
	}

Open in new window

On line 21, Don't make it an "else" condition. Make two totally separate if/else blocks, it's just that they can be in the one loop. And, you have them around the wrong way, for the yUp yDown comparison. If you think carefully about 3 scenarios, a y less than the current minimum, a y between the min and max and a y greater than the max, and follow it through the if/then/else that you had, you should see the issue.

It should be like below...

public Point[] extremes() {
		if (this.isEmpty())
			return null;

		// left, right , top, bottom
		Point left = null, right = null, top = null, bottom = null;
		Point returnArray[] = new Point[4];

		double xLeft = points[0].getX();
		double xRight = points[0].getX();
		double yUp = points[0].getY();
		double yDown = points[0].getY();
		
		for (int i = 0; i < size; i++) {
			if (points[i].getX() < xLeft) {
				xLeft = points[i].getX();
				left = points[i];
			} else if (points[i].getX() > xRight) {
				xRight = points[i].getX();
				right = points[i];
			}

                        if (points[i].getY() < yDown) {
				yDown = points[i].getY();
				bottom = points[i];
			} else if (points[i].getY() > yUp) {
				yUp = points[i].getY();
				top = points[i];
			}
		}
		
		
		returnArray[0] = left;
		returnArray[1] = right;
		returnArray[2] = top;
		returnArray[3] = bottom;
		
		
		
		
		
		return returnArray;
	}

Open in new window

Sorry, forget that last part about the order of the comparison, I am obviously still waking up and my brain is not functioning 100% !!
Even with the split x & y if/else statements and swapped yup and ydown if elses the output remains the same. Do you know why the left point object is not be initialized?

ASKER CERTIFIED SOLUTION
Avatar of mccarl
mccarl
Flag of Australia image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial