-1

コレクション内の選択された値に最も近い値を見つけるメソッドを作成しました。Junitでテストケースを書く方法がわからないので、うまくいくかどうかわかりません。この方法は機能しますか、またはテスト ケースのアイデアはありますか。最も近いのは距離によって決まります。制限により、このメソッドには配列リストを使用できません。

テレメータ

  public interface Telemeter<E> extends Comparator<E> {

   /**
    * Returns the distance between e1 and e2.
    *
    * @param e1 the first object
    * @param e2 the second object
    * @return the distance between e1 and e2
    *
    */

   public double distance(E e1, E e2);



}

最寄りの方法

    /**
    * Return the element of c nearest to val.
    * The Collection c is not changed as a result of calling this method.
    *
    * @param <T> the type variable for this method
    * @param c the Collection to be searched
    * @param val the reference value
    * @param tm the Telemeter that measures distance
    * @return the element e in c such that its distance from
    * val is minimum for all elements in c
    *
    */
   public static <T> T nearest(Collection<T> c, T val, Telemeter<T> tm) {
      if (c == null || c.size() == 0 || tm == null) {
         throw new IllegalArgumentException();
      }
      T answer = null;
      Iterator<T> itr = c.iterator();
      T one = itr.next();       
      while(itr.hasNext()) {

         T two = itr.next();
         if(Math.abs((tm.distance(one, val))) > Math.abs(tm.distance(two, val))) {
         answer = two; 
         }
      }    
      return answer;
   }
4

2 に答える 2

0

あなたは近いです..しかし、「1」を更新する必要があります。そうしないと、常に距離をコレクションの最初の要素と比較することになります。これを試して:

Iterator<T> itr = c.iterator();
T answer = itr.next();       
while(itr.hasNext()) {

    T two = itr.next();
    if(Math.abs((tm.distance(answer, val))) > Math.abs(tm.distance(two, val))) {
    answer = two; 
    }
}    
return answer;

そして、自分が書いたコードのテスト ケースを必ず書くべきだという ATG の意見に同意します。単純なシナリオだけでなく、配列に重複がある場合や配列内のどの要素よりも小さい値がある場合 (コードは最小の要素を返す必要がある) などのより複雑なシナリオもテストしてみてください。

于 2013-09-16T16:21:20.457 に答える
0

コードが単一の要素を持つコレクションで返されるという問題がありますが、nullおそらく単一の要素を返す必要があります。

ただし、正直に言うと、何らかのテストを作成する必要があります。JUnit や TestNG などに慣れておらず、学習する時間がまったくない場合は、単純なメイン メソッドを作成し、納得がいくまで値をいじることができます。SO コミュニティに助けを求めると、すぐにバグが見つかるかもしれませんが、このコードをリファクタリングすると、期待どおりに動作し続けるという証拠がなくなります。

于 2013-09-16T16:30:45.137 に答える