集合的通用最近值搜索方法

时间:2013-09-16 16:14:25

标签: java search collections iterator

我创建了一种方法来查找最接近集合中所选值的值。我不知道它是否会起作用,因为我不知道如何在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;
   }

2 个答案:

答案 0 :(得分:0)

你很近..但你必须更新“一”,否则你将始终将距离与集合的第一个元素进行比较。试试这个:

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的观点,你肯定应该为你编写的代码编写一些测试用例。尝试测试简单的场景,以及更复杂的场景,例如在数组中有重复项时,值小于数组中的任何元素(代码应返回最低元素),等等。

答案 1 :(得分:0)

您遇到的问题是,您的代码会在具有单个元素的集合中返回null,而它应该返回单个元素。

老实说,你真的应该写一些测试。如果你对JUnit,TestNG等不满意,并且绝对没有时间学习,那么你可以编写一个简单的主方法,只需要玩值,直到你开心。向SO社区寻求帮助可能在短期内发现错误,但在您重构此代码时,您将无法证明其继续按预期工作。