如何从数组中的一个点找到 3 个最近的坐标 Java
How to find 3 closest coordinates from a point in an array Java
我有一个家庭作业,我完全卡住了(级别:初学者)。
我必须创建一个方法来找到距用户条目和数组中所有点的 3 个最近距离 - 我被困在这里。
方法是:
public static int[] troisPlusProches (int x, int y, int[] coordonneesHabitations)
其中 int x 和 int y 是用户条目,数组 int[] coordonneesHabitations 是 int[] coordonneesHabitations =
{9、30、18、8、3、18、25、36}。
所以这些点是 (9,30)、(18,8)、(3,18) 和 (25,36)。
我使用公式:distance = Math.sqrt(((x1 - x2) * (x1 - x2)) + ((y1 - y2) * (y1 - y2))) 来计算距离.
现在我必须找到与用户条目的 3 个最短距离以及 return 它们在新数组中的位置。
因此,如果用户条目为 x=10,则 y=15。
最短的距离点(3, 18)为7.616,下一个距离点(18, 8)为10.630,第三个距离点(9, 30)为15.033。
在这种情况下,该方法应该 return 一个数组 int[] troisPlusProches =
{3, 18, 18, 8, 9, 30}.
我知道我必须做什么,但我不知道如何...
这是众多错误尝试之一:
public static int[] troisPlusProches (int x, int y, int[] (coordonneesHabitations)
{
int [] that = Arrays.copyOf(coordonneesHabitations, coordonneesHabitations.length);
int table[] = new int[6];
double distanceA = 0.0;
double minDistance = Float.MAX_VALUE;
int a = 0;
int b = 0;
int i = 0;
double ignore = Float.MAX_VALUE;
double ignore2 = Float.MAX_VALUE;
for (i = 0; i < that.length; i += 2) {
a = that[i];
b = that[i+1];
distanceA = calculerDistance(a, b, x, y);
if (distanceA < minDistance) {
minDistance = distanceA;
table[0] = a;
table[1] = b;
}
}
ignore = minDistance;
for (i = 0; i < that.length; i += 2) {
a = that[i];
b = that[i+1];
distanceA = calculerDistance(a, b, x, y);
if (distanceA == ignore) {
continue;
}
if (distanceA < minDistance) {
minDistance = distanceA;
table[2] = a;
table[3] = b;
}
}
ignore2 = minDistance;
for (i = 0; i < that.length; i += 2) {
a = that[i];
b = that[i+1];
distanceA = calculerDistance(a, b, x, y);
if ((distanceA == ignore) || (distanceA == ignore2)) {
continue;
}
if (distanceA < minDistance) {
minDistance = distanceA;
table[2] = a;
table[3] = b;
}
}
return table;
}
我不会说法语,所以很难阅读您的代码。但是,这样想:
你有一种方法可以计算离用户输入最近的点。现在您需要创建该方法的副本,它允许您计算最接近用户条目的点 不包括您已经找到的点 。这将使您找到第一个和第二个最近的点。然后做同样的事情找到第三个点,这次排除你已经找到的两个点。
您可以复制现有方法。它可能看起来像这样:
public static int plusProche (int x, int y, int[] coordonneesHabitations, int ignoreIndex) {
double distanceA = 0.0;
int k = x;
int z = y;
int a = 0;
int b = 0;
int [] that = Arrays.copyOf(coordonneesHabitations, coordonneesHabitations.length);
int taille = that.length;
int i = 0;
double minDistance = Float.MAX_VALUE;
int position = 0;
for (i = 0; i < taille; i += 2) {
//here we add the ability to skip the passed index
if ((i / 2) == ignoreIndex) {
continue;
}
a = that[i];
b = that[i+1];
distanceA = calculerDistance(a, b, k, z);
if (distanceA < minDistance) {
minDistance = distanceA;
position = i/2;
System.out.println(i + " " + minDistance);
}
}
return position;
}
您可以使用上面的方法找到第二个最近点,方法是将最近点的索引作为参数传递。它将跳过该索引,从而找到下一个最接近的索引。做类似的事情找到第三个最近的点。
有一个可行的解决方案,以备不时之需...
public static int[] troisPlusProches (int x, int y, int[] coordonneesHabitations)
{
LinkedList<Integer> resultArray = new LinkedList<Integer>();
int[] origArr = Arrays.copyOf(coordonneesHabitations, coordonneesHabitations.length);
while (resultArray.size() < 6) {
int positionInArray = Decharge.plusProche(x, y, origArr);
LinkedList<Integer> newArr = new LinkedList<Integer>();
for (int i = 0; i < origArr.length; i = i + 2) {
if (i != positionInArray * 2) {
newArr.add(origArr[i]);
newArr.add(origArr[i + 1]);
} else {
resultArray.add(origArr[i]);
resultArray.add(origArr[i + 1]);
}
}
origArr = new int[newArr.size()];
for (int k = 0; k < origArr.length; k++) {
origArr[k] = newArr.get(k);
}
}
int[] intResultArray = new int[resultArray.size()];
for (int l = 0; l < intResultArray.length; l++) {
intResultArray[l] = resultArray.get(l);
}
return intResultArray;
我有一个家庭作业,我完全卡住了(级别:初学者)。
我必须创建一个方法来找到距用户条目和数组中所有点的 3 个最近距离 - 我被困在这里。
方法是: public static int[] troisPlusProches (int x, int y, int[] coordonneesHabitations) 其中 int x 和 int y 是用户条目,数组 int[] coordonneesHabitations 是 int[] coordonneesHabitations = {9、30、18、8、3、18、25、36}。 所以这些点是 (9,30)、(18,8)、(3,18) 和 (25,36)。
我使用公式:distance = Math.sqrt(((x1 - x2) * (x1 - x2)) + ((y1 - y2) * (y1 - y2))) 来计算距离.
现在我必须找到与用户条目的 3 个最短距离以及 return 它们在新数组中的位置。
因此,如果用户条目为 x=10,则 y=15。
最短的距离点(3, 18)为7.616,下一个距离点(18, 8)为10.630,第三个距离点(9, 30)为15.033。 在这种情况下,该方法应该 return 一个数组 int[] troisPlusProches = {3, 18, 18, 8, 9, 30}.
我知道我必须做什么,但我不知道如何...
这是众多错误尝试之一:
public static int[] troisPlusProches (int x, int y, int[] (coordonneesHabitations)
{
int [] that = Arrays.copyOf(coordonneesHabitations, coordonneesHabitations.length);
int table[] = new int[6];
double distanceA = 0.0;
double minDistance = Float.MAX_VALUE;
int a = 0;
int b = 0;
int i = 0;
double ignore = Float.MAX_VALUE;
double ignore2 = Float.MAX_VALUE;
for (i = 0; i < that.length; i += 2) {
a = that[i];
b = that[i+1];
distanceA = calculerDistance(a, b, x, y);
if (distanceA < minDistance) {
minDistance = distanceA;
table[0] = a;
table[1] = b;
}
}
ignore = minDistance;
for (i = 0; i < that.length; i += 2) {
a = that[i];
b = that[i+1];
distanceA = calculerDistance(a, b, x, y);
if (distanceA == ignore) {
continue;
}
if (distanceA < minDistance) {
minDistance = distanceA;
table[2] = a;
table[3] = b;
}
}
ignore2 = minDistance;
for (i = 0; i < that.length; i += 2) {
a = that[i];
b = that[i+1];
distanceA = calculerDistance(a, b, x, y);
if ((distanceA == ignore) || (distanceA == ignore2)) {
continue;
}
if (distanceA < minDistance) {
minDistance = distanceA;
table[2] = a;
table[3] = b;
}
}
return table;
}
我不会说法语,所以很难阅读您的代码。但是,这样想:
你有一种方法可以计算离用户输入最近的点。现在您需要创建该方法的副本,它允许您计算最接近用户条目的点 不包括您已经找到的点 。这将使您找到第一个和第二个最近的点。然后做同样的事情找到第三个点,这次排除你已经找到的两个点。
您可以复制现有方法。它可能看起来像这样:
public static int plusProche (int x, int y, int[] coordonneesHabitations, int ignoreIndex) {
double distanceA = 0.0;
int k = x;
int z = y;
int a = 0;
int b = 0;
int [] that = Arrays.copyOf(coordonneesHabitations, coordonneesHabitations.length);
int taille = that.length;
int i = 0;
double minDistance = Float.MAX_VALUE;
int position = 0;
for (i = 0; i < taille; i += 2) {
//here we add the ability to skip the passed index
if ((i / 2) == ignoreIndex) {
continue;
}
a = that[i];
b = that[i+1];
distanceA = calculerDistance(a, b, k, z);
if (distanceA < minDistance) {
minDistance = distanceA;
position = i/2;
System.out.println(i + " " + minDistance);
}
}
return position;
}
您可以使用上面的方法找到第二个最近点,方法是将最近点的索引作为参数传递。它将跳过该索引,从而找到下一个最接近的索引。做类似的事情找到第三个最近的点。
有一个可行的解决方案,以备不时之需...
public static int[] troisPlusProches (int x, int y, int[] coordonneesHabitations)
{
LinkedList<Integer> resultArray = new LinkedList<Integer>();
int[] origArr = Arrays.copyOf(coordonneesHabitations, coordonneesHabitations.length);
while (resultArray.size() < 6) {
int positionInArray = Decharge.plusProche(x, y, origArr);
LinkedList<Integer> newArr = new LinkedList<Integer>();
for (int i = 0; i < origArr.length; i = i + 2) {
if (i != positionInArray * 2) {
newArr.add(origArr[i]);
newArr.add(origArr[i + 1]);
} else {
resultArray.add(origArr[i]);
resultArray.add(origArr[i + 1]);
}
}
origArr = new int[newArr.size()];
for (int k = 0; k < origArr.length; k++) {
origArr[k] = newArr.get(k);
}
}
int[] intResultArray = new int[resultArray.size()];
for (int l = 0; l < intResultArray.length; l++) {
intResultArray[l] = resultArray.get(l);
}
return intResultArray;