我的方法看起来像
public double calculator(Iterable<Integer> userRating)
我试图实现消除最高和最低值并计算平均值的逻辑。最终结果应该是(删除分钟-2和最大15)
public void ProperlyCalculates() {
List<Integer> ratings = new ArrayList<Integer>();
ratings.add(-2);
ratings.add(-2);
ratings.add( 3);
ratings.add( 7);
ratings.add( 8);
ratings.add( 9);
ratings.add(15);
ratings.add(15);
ratings.add(15);
double rating = rater.getMovieRating(ratings);
assertEquals(6.75D, rating, 0.0000001D);
我迷惑自己试图创建一个迭代器,我可以循环并添加我的逻辑。到目前为止我已经尝试过。
public double getMovieRating(Iterable<Integer> userRating) {
Iterator ratings = userRating.iterator();
int min = Integer.MIN_VALUE;
int max = Integer.MAX_VALUE;
while (ratings.hasNext()) {
Integer val = ratings.next();
if (val > max){ max = val;}
if (val < min) {min = val;}
}
}
但是Integer val = ratings.next()
会引发incompatible type
错误。我怎样才能遍历迭代器中的所有值?这是一个需要私人内部课程的情况吗?
答案 0 :(得分:2)
有两种方法可以解决此问题。为Iterator
提供类型,如此
Iterator<Integer> ratings = userRating.iterator(); // An iterator of type Integer
或将iterator.next()
返回的值转换为Integer
,如此
Integer val = (Integer) ratings.next();
在第一种情况下,您确保Iterator
返回的每个元素都只是Integer
类型。在第二种情况下,您将值转换为Integer
,因为默认情况下,没有类型的Iterator
会返回Object
。
答案 1 :(得分:1)
除了@ R.J所说的,你还应该考虑使用for:next语法,因为它使这更简单:
public double getMovieRating(Iterable<Integer> userRating) {
int min = Integer.MIN_VALUE;
int max = Integer.MAX_VALUE;
for(Integer rating : userRating) {
final int val = rating.intValue();
if (val > max){ max = val;}
if (val < min) {min = val;}
}
}