我有以下代码执行以下操作: - 它需要一个温度和一个通道索引,并搜索一个对象列表(包含温度数组)并返回找到温度的对象的索引。 我希望这个方法在找到第一个时结束,因为这是达到温度的最早时间(已记录)
public int findRow(double targetTemperature, int ch)
{
//This method takes a double and finds it in the List, it then returns the element in which it is (the row)
//The element returned can be used with duration.between to find the response time between 2 known values
for (int i=0; i < readings.size(); i++)
{
double compareTemp = readings.get(i).getValue(ch);
if (compareTemp > targetTemperature)
{
System.out.println(readings.get(i).getTimestamp() + "is above target temp for channel " + ch);
return i;
}
else
{
System.out.println(readings.get(i).getTimestamp() + "Is not above target temp for channel " + ch);
return 0;
}
}
}
List包含TemperatureReadings,它是我创建的一个有两个变量的类:
- 值数组的双打
- 带有currentime的时间戳(创建数组时)
我正在尝试找到每个频道的响应时间。但是,当我运行上面的代码时,它表示“没有返回语句”,即使两个选项都有一个return语句(if / else)
或者,如果你能帮助我找到一个更好的方法来找到列表的第一次发生,那个通道中的温度(数组索引)达到X度,我真的很感激。
实际上我不希望它返回0如果可能的话返回错误或者说“没有找到温度”或类似的东西
答案 0 :(得分:2)
因为你的if语句在你的循环中,如果你的循环没有运行会发生什么? ==&GT;意味着你没有退货声明! 从循环中添加一个return语句,虽然你知道它不能运行这个语句只是因为你确定循环会运行,但是编译器不知道
答案 1 :(得分:1)
Tuyen是对的。此外,您不需要else语句。您将在第一个项目后返回。你只需要第一个if,然后在循环外返回0;
尝试:
.*
答案 2 :(得分:1)
您的循环不正确:如果第一个元素不符合条件,则该方法将在else分支中返回,甚至不检查列表中的其他元素。
你可以删除else brach,并制定一个约定(和javadoc注释,如果没有找到具有指定条件的项目,则返回-1)...
public int findRow(double targetTemperature, int ch) {
for (int i = 0; i < readings.size(); i++) {
if (readings.get(i).getValue(ch) > targetTemperature)
return i;
}
return -1;
}
...您可以根据来电方的返回值记录任何内容:
int channel = 2;
int ind = findRow(35, channel);
if (ind >= 0)
System.out.println(readings.get(ind).getTimestamp() + " is above target temp for channel " + channel);
else
System.out.println("Nothing has been found");
使用流:
public int findRow(double targetTemperature, int ch) {
return IntStream.range(0, readings.size())
.filter(i -> readings.get(i).getValue(ch) > targetTemperature)
.findFirst()
.orElse(-1);
}