Java 查找较大值的通用方法在某些测试中失败

Java 查找较大值的通用方法在某些测试中失败,java,methods,collections,Java,Methods,Collections,我创建了一个方法,可以在集合中查找大于选定值的所有值,但有时不正确。有人知道为什么吗?以下是两个失败的例子: Selector test case - method greater: val less than all elements. java.lang.AssertionError: c = [-5,-2,0,4,8,15,50] val = -99 expected:<true> but was:<false> Selector test case

我创建了一个方法,可以在集合中查找大于选定值的所有值,但有时不正确。有人知道为什么吗?以下是两个失败的例子:

 Selector test case - method greater: val less than all elements. 
 java.lang.AssertionError: c = [-5,-2,0,4,8,15,50] val = -99 expected:<true> 
 but was:<false>

 Selector test case - method greater: val equal to elements. 
 java.lang.AssertionError: c = [-5,-2,0,4,8,15,50] val = -5 expected:<true> 
 but was:<false>
选择器测试用例-方法大于:val小于所有元素。
java.lang.AssertionError:c=[-5,-2,0,4,8,15,50]val=-99预期值:
但是:
选择器测试用例-方法更大:val等于元素。
java.lang.AssertionError:c=[-5,-2,0,4,8,15,50]val=-5预期值:
但是:
遥测仪-用于距离测量
*定义对象之间距离查找的抽象行为。
*作为比较器的子接口,遥测仪还定义了
*类型参数E的对象的总顺序。
* 
*
*
*@param定义距离和顺序的类型
*
*/
公共接口遥测扩展比较器{
/**
*返回e1和e2之间的距离。
*
*@param e1第一个对象
*@param e2第二个对象
*@返回e1和e2之间的距离
*
*/
公共双倍距离(e1、e2);
}
用于更大值的方法
/**
*返回大于val的所有c元素的集合。
*如果c不包含大于val的元素,则此方法返回
*空集合。
*
*@param此方法的类型变量
*@param c要搜索的集合
*@param val为参考值
*@param tm测量距离的遥测仪
*@返回c中元素e的集合
*使得e大于val
*
*/
公共静态集合(集合c、T val、,
遥测仪(tm){
如果(c==null | | c.size()==0 | | tm==null){
抛出新的IllegalArgumentException();
}
集合应答=新建ArrayList();
迭代器a=c.迭代器();
while(a.hasNext()){
if(tm.距离(a.next(),val)<0){
回答。加上(a.下一步());
}
}   
返回答案;
}

您的代码非常不完整,“距离”的概念具有误导性(距离通常被认为是非负的)。但是有一件事可能会导致错误的结果,那就是你调用了两次a.next(),这将使迭代器在同一次“while”迭代中前进两次(如果条件为true)。

你的错误在于你在循环中调用了两次
a.next()
,因此你将下一个元素添加到你比较的元素中:调用
next()
不仅返回下一个元素,还推进迭代器

但是!你的设计全错了。该方法的泛型类型应扩展
compariable
而不是
compariator
。这样,您就不需要界面
Telemetet

然后,您的方法就是:

public static <T extends Comparable<T>> Collection<T> greater(Collection<T> c, T val) {
    if (c == null || c.size() == 0 || val == null) {
       throw new IllegalArgumentException();
    }

    Collection<T> answer = new ArrayList<T>();
    for (T a : c) {
       if (val.compareTo(a) < 0) {
           answer.add(a);
       }
    }   
    return answer;
}
publicstaticcollection更大(Collection c,T val){
如果(c==null | | c.size()==0 | | val==null){
抛出新的IllegalArgumentException();
}
集合应答=新建ArrayList();
对于(TA:c){
如果(值与(a)相比<0){
答复.添加(a);
}
}   
返回答案;
}

不要要求我们为您调试。使用IDE的调试器,如果不能直接调试代码,请逐步完成。这些是我在尝试调试后无法解决的问题。它过去根本不起作用,但有时使用调试器查找这些时间并回溯是不正确的。那个不正确的值是从哪里来的?
 /**
    * Return a Collection of all the elements of c that are greater than val.
    * If c contains no elements greater than val, this method returns an
    * empty Collection.
    *
    * @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 a Collection of the elements e in c 
    * such that e is greater than val
    *
    */
   public static <T> Collection<T> greater(Collection<T> c, T val, 
      Telemeter<T> tm) {
      if (c == null || c.size() == 0 || tm == null) {
         throw new IllegalArgumentException();
      }

      Collection<T> answer = new ArrayList<T>();
      Iterator<T> a = c.iterator();
      while  (a.hasNext()) {
         if (tm.distance(a.next(), val) < 0) {
            answer.add(a.next());
         }
      }   
      return answer;   




}
public static <T extends Comparable<T>> Collection<T> greater(Collection<T> c, T val) {
    if (c == null || c.size() == 0 || val == null) {
       throw new IllegalArgumentException();
    }

    Collection<T> answer = new ArrayList<T>();
    for (T a : c) {
       if (val.compareTo(a) < 0) {
           answer.add(a);
       }
    }   
    return answer;
}