Caspermartijn - 1 year ago 77
Java Question

# How to get the nearest Vector to a given target from a list

So imagine I've created a

`Vector`
class with two variables
`x`
and
`y`
in Java:

``````public class Vector {
private int x;
private int y;

public Vector(int x, int y) {
this.x = x;
this.y = y;
}

public int getX() {
return this.x;
}

public int getY(){
return this.y;
}
}
``````

Then I've craeted an
`ArrayList`
of vectors:

``````private List<Vector> vecs = new ArrayList<Vector>();
``````

I've created in that list:

``````8,9
10,5
83473834,938849584985
etc ...
``````

Now I want to get the closest vector to another vector.
Example:

``````private List<Vector> vecs = new ArrayList<Vector>();
private Vector vec = new Vector(1,1);

for(Vector vector:vecs) {
//What do i put here??
}
``````

So what do i put in the for loop to make it select the nearest vector from the vector list?

I would start by adding a method to the `Vector` class, `distanceTo`, that calculates the distance from this vector to another one:

``````public double distanceTo(Vector vec) {
double dx = x - vec.x;               //calculate the diffrence in x-coordinate
double dy = y - vec.y;               //calculate the diffrence in y-coordinate
return Math.sqrt(dx*dx + dy*dy);     //use the distance formula to find the difference
}
``````

And then you can write the following method that returns the closest vector in a list to a given vector:

``````public static Vector closest(Vector target, List<Vector> list) {
Vector closest = list.get(0);                                 //this variable will kep track of the closest vector we have found yet. We simply start with the first one

for(int i = 1; i < list.size(); i++) {                        //loop over the list, skipping the first entry
Vector curr = list.get(i);                                //get the current vector from the list
if (target.distanceTo(curr) < target.distanceTo(closest)) //if the current vector is closer to target than the closest one yet
closest = curr;                                       //keep the current vector as the new closest one
}

return closest;                                               //return the resulting vector
}
``````

This method can then be used like this:

``````Vector target = new Vector(1, 2);

List<Vector> vecs = new ArrayList<Vector>();