2016-10-19 2 views
-3

Ich habe eine Hausaufgabe, und ich bin völlig fest (Level: Anfänger).So finden Sie 3 nächstgelegene Koordinaten von einem Punkt in einem Array Java

Ich muss eine Methode erstellen, die 3 nächstgelegene Entfernungen von einem Benutzereintrag und alle Punkte in einem Array findet - und ich stecke hier fest.

Die Methode ist: public static int [] troisPlusProches (int x, int y, int [] coordonneesHabitations) wo int x und int y Benutzereinträge sind, und das Array int [] coordonneesHabitations ist int [] coordonneesHabitations = {9, 30, 18, 8, 3, 18, 25, 36}. Also sind die Punkte (9,30), (18,8), (3,18) und (25,36).

Ich habe die Formel verwendet: Abstand = Math.sqrt (((x1 - x2) * (x1 - x2)) + ((y1 - y2) * (y1 - y2))), um die Abstände zu berechnen.

Und jetzt muss ich 3 kürzeste Entfernungen von einem Benutzer Einträge finden und ihre Positionen in einem neuen Array zurückgeben.

Wenn also die Benutzereinträge x = 10, y = 15 sind.

Die kürzeste Entfernung ist 7.616 von einem Punkt (3, 18), die nächste ist 10.630 von einem Punkt (18, 8), und die dritte ist 15.033 von einem Punkt (9, 30). In diesem Fall sollte die Methode ein Array int [] troisPlusProches = {3, 18, 18, 8, 9, 30} zurückgeben.

Ich weiß, was ich zu tun habe, kann ich einfach nicht herausfinden, wie ...

Hier ist eine der vielen Fehlversuchen:

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; 
    } 
+2

Im Hinblick auf diese Aufgabe: Meine dritte Aufgabe ist es, ein Verfahren zu schaffen, und 3 am nächsten Abständen von einem Benutzereintrag und alle Punkte finden in einem Array - und ich stecke jetzt seit 2 Tagen hier fest. Angesichts dieser Hausaufgabe ist ein guter Ratschlag, es rohe Gewalt zu codieren und später zu optimieren. Also bei einem Benutzereintrag die Entfernung zu jedem anderen Punkt finden und dann sortieren und die 3 kleinsten nehmen. – mba12

+0

Ich poste, was ich in der nächsten Antwort getan habe, es ist ziemlich genau das, was ich die ganze Zeit gemacht habe. Aber ich bekomme die Ergebnisse für die 2. und 3. Distanz nicht. Ich habe versucht, es in eine Schleife zu bringen, ich habe 3 separate Schleifen ausprobiert (wie im Beispiel unten).Ich habe versucht, innerhalb einer Schleife zu loopen ... Aber immer noch keine Ergebnisse; ( – Frenchie

+0

) Sie müssen 'minDistance' auf' Float.MAX_VALUE' zurücksetzen, bevor Sie nach dem zweiten und dritten Punkt suchen. Sonst wird es nie etwas finden, weil alle Punkte sind größere Entfernung als die alte Min. – nhouser9

Antwort

0

Ich spreche nicht französisch so ich finde es schwer, deinen Code zu lesen. Aber denken Sie darüber nach:

Tou haben eine Methode, die den nächsten Punkt zu einem Benutzereintrag berechnet. Jetzt müssen Sie eine Kopie dieser Methode erstellen, mit der Sie den nächsten Punkt zu einem Benutzereintrag berechnen können, ohne den Punkt, den Sie bereits gefunden haben. Dadurch können Sie den ersten und den zweitnächsten Punkt finden. Dann machen Sie dasselbe, um den dritten Punkt zu finden, diesmal durch Ausschließen der zwei Punkte, die Sie bereits gefunden haben.

Sie können eine Kopie Ihrer bestehenden Methode erstellen. Es könnte wie folgt aussehen:

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; 
} 

Sie können die oben verwenden, um den zweiten am nächsten Punkt zu finden, die durch den Index des nächsten Punktes als Argument übergeben. Dieser Index wird übersprungen und der nächste Index wird gefunden. Tun Sie etwas Ähnliches, um den drittnächsten Punkt zu finden.

+0

Ja, ich suchte nach so etwas ... Ich werde es versuchen, vielen Dank. – Frenchie

+0

@Frenchie Glücklich zu helfen.Wenn es funktioniert, bitte upvote und akzeptieren, wenn nicht lass mich wissen, – nhouser9

+0

Ich habe nur 1 Follow-up Frage, welchen Wert ignoreIndex haben? Ich wusste, was ich von Anfang an tun muss, ich weiß nur nicht, wie der erste Wert aus der zweiten Suche auszuschließen ... Nochmals vielen Dank: – Frenchie

0

Es gibt eine Lösung, die für den Fall arbeitet jemand könnte es brauchen ...

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; 
Verwandte Themen