我有以下ArrayList List<DataSt> list1
,其中list1
具有以下值(浮点数):
<25.89, 21.23>
< 5.89, 1.23>
< 3.69, 20.23>
< 2.89, 121.23>
<125.89, 231.23>
.
.
.
< 28.89, 41.23>
DataSt
具有以下结构:
public class DataSt {
private float a;
private float b;
public DataSt(float a , float b){
this.a=a;
this.b=b;
}
}
现在我需要找到第一列的最小值,即<25.89, 5.89, 3.69, 2.89, 125.89 ... 28.89>
它必须返回2.89
然后从<25.89, 5.89, 3.69, 2.89, 125.89 ... 28.89>
找到最大值,它必须返回125.89
现在对第二列重复相同的操作,并将它们分别存储为4个不同的变量,分别为min_col1,max_col1,min_col2和max_col2。
min_col1 = 2.89
max_col1 = 125.89
min_col2 = 1.23
max_col2 = 231.23
我一直在寻找各种解决方案,建议使用两个for循环非常耗时,一些线程建议使用stream()找到整个列表(即,不是每列)。
有一种有效的方法吗?我也在关注Apache Commons。
答案 0 :(得分:1)
如果您只需要找到这些值,那么只需循环遍历列表一次即可。我建议稍微研究一下Big O符号,以了解算法的性能。
您可以这样做:
float min_col1 = Float.MAX_VALUE;
float max_col1 = Float.MIN_VALUE;
float min_col2 = Float.MAX_VALUE;
float max_col2 = Float.MIN_VALUE;
for (DataSt data : list1) {
if (data.getA() < min_col1) {
min_col1 = data.getA();
}
if (data.getA() > max_col1) {
max_col1 = data.getA();
}
if (data.getB() < min_col2) {
min_col2 = data.getB();
}
if (data.getB() > max_col2) {
max_col2 = data.getB();
}
}
答案 1 :(得分:0)
很遗憾没有FloatStream
,但你可以将这些值扩大到两倍,然后安全地缩小它们。
我认为你有A和B的吸气剂,你已经被淘汰了。
if (list1.isEmpty())
{
throw /*something*/;
}
min_col1 = (float) list1.stream().mapToDouble(DataSt::getA).min().getAsDouble();
max_col1 = (float) list1.stream().mapToDouble(DataSt::getA).max().getAsDouble();
min_col2 = (float) list1.stream().mapToDouble(DataSt::getB).min().getAsDouble();
max_col2 = (float) list1.stream().mapToDouble(DataSt::getB).max().getAsDouble();
答案 2 :(得分:0)
我为你制作了一些样品。
float Fmin = 0f;
float Fmax = 0f;
float Smin = 0f;
float Smax = 0f;
for (int i = 0; i < dataSts.size(); i++)
{
DataSt dataSt = dataSts.get(i);
float a = dataSt.getA();
float b = dataSt.getB();
if(i == 0)
{
Fmin = a;
Fmax = a;
Smin = b;
Smax = b;
continue;
}
if(a < Fmin )
Fmin = a;
if(b < Smin )
Smin = b;
if(a > Fmax)
Fmax = a;
if(b > Smax)
Smax = b;
}
System.out.println(Fmin +": "+Fmax+" : "+Smin+" : "+Smax);