在对象的ArrayList

时间:2017-07-31 09:09:05

标签: java arraylist max min

我有以下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。

3 个答案:

答案 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);