我创建了一种方法来查找最接近集合中所选值的值。我不知道它是否会起作用,因为我不知道如何在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;
}
答案 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社区寻求帮助可能在短期内发现错误,但在您重构此代码时,您将无法证明其继续按预期工作。