2016-10-19 25 views
-3

私は宿題を割り当てていますが、私は完全に立ち往生しています(レベル:初心者)。配列のポイントから3つの最も近い座標を見つける方法Java

私はユーザーのエントリから3つの最も近い距離と配列のすべての点を見つける方法を作成する必要があります - そして、私はここで立ち往生しています。

方法がある: パブリックstatic int型[] troisPlusProches(int型のx、int型のY、[] coordonneesHabitationsをINT)INT x、yをINTはユーザー・エントリであり、そして配列INT [] coordonneesHabitations []はcoordonneesHabitations intで = {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つの最短距離を見つけて、それらの位置を新しい配列に戻さなければなりません。

したがって、ユーザーエントリがx = 10、y = 15の場合。

ポイント(3,18)からの最短距離は7.616であり、次のポイントはポイント(18,8)から10.630であり、3番目のポイントはポイント(9,30)から15.033です。 この場合、メソッドは配列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; 
    } 
+2

:私の第三タスクはメソッドを作成して、ユーザーエントリおよびすべてのポイントから3つの最も近い距離を見つけることです配列で - そして、私はここで2日間ここで立ち往生しています。これが宿題割り当ての良いアドバイスであるとすれば、それを強引にコード化し、後で最適化することです。だから、ユーザーのエントリを各他のすべてのポイントまでの距離を見つけるし、並べ替え、3を最小限に取る。 – mba12

+0

私は次の答えに行ったことを投稿します。それはずっとずっとずっとやっていました。しかし、私は2番目と3番目の距離の結果を得ていません。私は1つのループに入れようとしましたが、私は3つの別々のループを試しました(下の例のように)。ループ内でループしようとしましたが、まだ結果はありません; – Frenchie

+0

2番目と3番目のポイントを探す前に 'minDistance'を' Float.MAX_VALUE'にリセットする必要があります。そうでなければ、 – nhouser9

答えて

0

あなたのコードを読むのが難しいです。しかし、次のように考えてみてください。

あなたは、ユーザーエントリに最も近いポイントを計算するメソッドを持っています。今度は、すでに見つかったポイントを除いて、ユーザエントリに最も近いポイントを計算できるようにそのメソッドのコピーを作成する必要があります。それはあなたが最初と二番目に近い点を見つけることができます。次に、同じことをして3つ目のポイントを見つけます。今回はすでに見つかった2つのポイントを除外します。

既存のメソッドのコピーを作成できます。あなたは、引数として最も近い点のインデックスを渡すことによって、第二の最も近い点を見つけるために、上記を使用することができます

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

:それは次のようになります。そのインデックスをスキップして、次に近いインデックスを見つけます。同様のことをして、3番目に近い点を見つけます。このタスクについて

+0

ええ、このようなものを探していました...試してみてください、ありがとうございます。 – Frenchie

+0

@Frenchie助けてくれるとうれしいです。私に知らせてください – nhouser9

+0

私はちょうど1つのフォローアップの質問を持っていますか?ignoreIndexにはどのような価値がありますか? 私は最初から何をしなければならないか分かっていました。もう一度ありがとうございます。 – Frenchie

0

機能するソリューションは、誰かがそれを必要とするかもしれない場合には、あります...

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; 
関連する問題