Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Lambda流获得最高平均速度_Java_Intellij Idea_Lambda_Java Stream - Fatal编程技术网

Java 使用Lambda流获得最高平均速度

Java 使用Lambda流获得最高平均速度,java,intellij-idea,lambda,java-stream,Java,Intellij Idea,Lambda,Java Stream,我必须用流api编写一个方法。在这个方法中,我应该在一个名为“Winner”的对象中得到一个整数值的最大值,我的意思是,这个整数值是平均速度值,我必须得到最高/最快的值。类如下所示 package U13_Lambdas_Streams.Streams; import java.time.Duration; import java.util.Arrays; import java.util.List; public class Winner { private int year; priv

我必须用流api编写一个方法。在这个方法中,我应该在一个名为“Winner”的对象中得到一个整数值的最大值,我的意思是,这个整数值是平均速度值,我必须得到最高/最快的值。类如下所示

package U13_Lambdas_Streams.Streams;

import java.time.Duration;
import java.util.Arrays;
import java.util.List;

public class Winner {

private int year;
private String nationality;
private String name;
private String team;
private int lengthKm;
private Duration winningTime;
private int stageWins;
private int daysInYellow;

public static final List<Winner> tdfWinners = Arrays.asList(
        new Winner(2006, "Spain", "Óscar Pereiro", "Caisse d'Epargne–
Illes Balears", 3657, Duration.parse("PT89H40M27S"), 8),
        new Winner(2007, "Spain", "Alberto Contador", "Discovery 
Channel", 3570, Duration.parse("PT91H00M26S"), 4),
        new Winner(2008, "Spain", "Carlos Sastre", "Team CSC", 3559, 
Duration.parse("PT87H52M52S"), 5),
        new Winner(2009, "Spain", "Alberto Contador", "Astana", 3459, 
Duration.parse("PT85H48M35S"), 7),
        new Winner(2010, "Luxembourg", "Andy Schleck", "Team Saxo Bank", 
3642, Duration.parse("PT91H59M27S"), 12),
        new Winner(2011, "Australia", "Cadel Evans", "BMC Racing Team", 
3430, Duration.parse("PT86H12M22S"), 2),
        new Winner(2012, "Great Britain", "Bradley Wiggins", "Team Sky", 
3496, Duration.parse("PT87H34M47S"), 14),
        new Winner(2013, "Great Britain", "Chris Froome", "Team Sky", 
3404, Duration.parse("PT83H56M20S"), 14),
        new Winner(2014, "Italy", "Vincenzo Nibali", "Astana", 3661, 
Duration.parse("PT89H59M06S"), 19),
        new Winner(2015, "Great Britain", "Chris Froome", "Team Sky",
3360, Duration.parse("PT84H46M14S"), 16),
        new Winner(2016, "Great Britain", "Chris Froome", "Team Sky",
3529, Duration.parse("PT89H04M48S"), 14)
);


public Winner(int year, String nationality, String name, String team, int
lengthKm, Duration winningTime, int daysInYellow) {
    this.year = year;
    this.nationality = nationality;
    this.name = name;
    this.team = team;
    this.lengthKm = lengthKm;
    this.winningTime = winningTime;
    this.daysInYellow = daysInYellow;
}

public double getAveSpeed() {
    return (getLengthKm() / (getWinningTime().getSeconds() / 3600));
}

public int getYear() {
    return year;
}

public void setYear(int year) {
    this.year = year;
}

public String getNationality() {
    return nationality;
}

public void setNationality(String nationality) {
    this.nationality = nationality;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getTeam() {
    return team;
}

public void setTeam(String team) {
    this.team = team;
}

public int getLengthKm() {
    return lengthKm;
}

public void setLengthKm(int lengthKm) {
    this.lengthKm = lengthKm;
}

public Duration getWinningTime() {
    return winningTime;
}

public void setWinningTime(Duration winningTime) {
    this.winningTime = winningTime;
}

public int getStageWins() {
    return stageWins;
}

public void setStageWins(int stageWins) {
    this.stageWins = stageWins;
}

public int getDaysInYellow() {
    return daysInYellow;
}

public void setDaysInYellow(int daysInYellow) {
    this.daysInYellow = daysInYellow;
}

@Override
public String toString() {
    return name;
}
}
我希望你们能帮忙


关于,Lukas

编辑:在阅读了Mark Keen的评论之后,主要的错误似乎是
getAveSpeed()
函数没有将长度转换为双精度,因此结果是四舍五入的。我在查看代码时忽略了这一点。如果
Winner
课程是按照练习的原样提供的,我会四处询问,以确保这是预期的行为。然而,最有可能的情况是类的方法是由OP编写的,在这种情况下,强制转换计算将是必要的更改。谢谢,马克

当我运行你的代码时,我实际上得到了6个名字

你的问题是,6名优胜者的平均速度为40.0,这是该组中最快/最高的速度。所以你得到的结果是正确的。你面临的主要问题是找出练习的要求,看看你是否只需要打印出最高速度、拥有最高速度的获奖者的名字,或者只打印出一个拥有最高速度的名字

关于代码的一个小警告是,在
winnerAVGSpeed()
函数中,您编写

.filter(winner -> winner.getAveSpeed() == getMaxAVGSpeed())
在你正在操纵的流上。您正在为流中的每个元素调用
getMaxAVGSpeed()
,这意味着您将遍历流并为列表中的每个元素计算一次最大速度。问题是,最大平均速度在任何时候都不会改变,因此您可以在开始操作流之前计算一次,将其存储在变量中,然后使用该变量,以提高代码的效率


如果您只需要打印出具有最大速度的单个名称,您也可以通过使用流函数
reduce
,在单流操作中执行此操作,该流函数允许您使用自定义函数将流比较并减少为单个元素。关于这一点有很多介绍,但您也可以找到许多不同的教程,介绍如何在流上使用
reduce
。不过这并不是必须的,你的方法对我来说似乎更清晰、更有用。

所有三个结果的平均速度都相同,因此你得到了三个结果。这是:
(getLengthKm()/(getWinningTime().getSeconds()/3600))
将返回一个整数(整数),该整数刚刚转换为一个双精度-根据该计算,您将得到3个相同的结果。在做算术之前,你需要先进行转换。您应该执行以下操作:
(双精度)getLengthKm()/(getWinningTime().getSeconds()/3600.0d)
.filter(winner -> winner.getAveSpeed() == getMaxAVGSpeed())