Java “如何仅从arraylist计算平均值”;计算正数而忽略负数)?

Java “如何仅从arraylist计算平均值”;计算正数而忽略负数)?,java,arraylist,Java,Arraylist,我想从arraylist中计算一个正平均值。它从arraylist中获取值,但在测试时只计算“正数” Integer[] array = new Integer[]{3, 2, -4, -7}; ArrayList<Integer> arrayList = new ArrayList<Integer>(Arrays.asList(array)); System.out.printf(averagePositive(arrayList)); Integer[]数组=新的

我想从arraylist中计算一个正平均值。它从arraylist中获取值,但在测试时只计算“正数”

Integer[] array = new Integer[]{3, 2, -4, -7}; 
ArrayList<Integer> arrayList = new ArrayList<Integer>(Arrays.asList(array));
System.out.printf(averagePositive(arrayList));
Integer[]数组=新的整数[]{3,2,-4,-7};
ArrayList ArrayList=新的ArrayList(Arrays.asList(array));
System.out.printf(平均正值(arrayList));
我试过使用abs,但没用

public static double averagePositive(ArrayList<Integer> values) {
    if (values == null || values.isEmpty())
       return 0.0;

    int sum = 0;
    int n = values.size();

    for (int i = 0; i < n  ; i++)
       if (values.get(i) > 0.0) {
           sum += values.get(i);
    }

    return ((double) sum) / n;
}
公共静态双平均值正(ArrayList值){
if(values==null | | values.isEmpty())
返回0.0;
整数和=0;
int n=values.size();
对于(int i=0;i0.0){
求和+=值。获取(i);
}
返回((双)和)/n;
}

我想要的输出是2.50,但是得到1.25,你应该计算正数值并除以该数值,而不是除以
n

int count = 0;
for (int i = 0; i < n  ; i++) {
    if (values.get(i) > 0.0) {
        sum += values.get(i);
        count++;
    }
}
if (count > 0) {
    return ((double) sum) / count;
} else {
    return 0;
}
int count=0;
对于(int i=0;i0.0){
求和+=值。获取(i);
计数++;
}
}
如果(计数>0){
返回((双)和)/计数;
}否则{
返回0;
}

您的代码几乎是正确的。你唯一缺少的部分是你想要取正元素的平均值,所以在你的例子中元素的总量应该是2。您应该只计算正元素,如下所示:

int n = 0;

for (int i = 0; i < n  ; i++)
   if (values.get(i) > 0.0) {
       sum += values.get(i);
       n++;
}
int n=0;
对于(int i=0;i0.0){
求和+=值。获取(i);
n++;
}

这应该可以解决问题。

您需要将总和除以正元素的数量,而不是总大小

public static double averagePositive(ArrayList<Integer> values) {
if (values == null || values.isEmpty())
   return 0.0;

int sum = 0;
int positive_n = 0;

for (int i = 0; i < n  ; i++)
   if (values.get(i) > 0.0) {
       sum += values.get(i);
         positive_n++;
}

return ((double) sum) / positive_n;
}
公共静态双平均值正(ArrayList值){
if(values==null | | values.isEmpty())
返回0.0;
整数和=0;
int正n=0;
对于(int i=0;i0.0){
求和+=值。获取(i);
正n++;
}
返回((双)和)/正;
}

您应该在除以列表大小时计算有多少正值:

int positiveCount = 0;
for (int i = 0; i < n  ; i++)
       if (values.get(i) > 0.0) {
           sum += values.get(i);
           positiveCount++;
}

return ((double) sum) / positiveCount;
int positiveCount=0;
对于(int i=0;i0.0){
求和+=值。获取(i);
正计数++;
}
返回((双)和)/正计数;
或者您可以使用流:

public static double averagePositive(List<Integer> values) {
    return values.stream()
                 .filter(d -> d > 0.0)
                 .mapToDouble(Function.identity())
                 .average().orElse(0.0);
}
public静态双平均值正值(列表值){
返回值。stream()
.过滤器(d->d>0.0)
.mapToDouble(函数.identity())
.average().orElse(0.0);
}

您的
n
等于数组的大小。相反,它应该是总正数的计数

public static void main(String[] args) {
    Integer[] array = new Integer[] { 3, 2, -4, -7 };
    ArrayList arrayList = new ArrayList(Arrays.asList(array));
    System.out.println(averagePositive(arrayList));
}

public static double averagePositive(ArrayList<Integer> values) {
    if (values == null || values.isEmpty())
        return 0.0;

    int sum = 0;
    int n = 0;

    for (int i = 0; i < values.size(); i++)
        if (values.get(i) > 0.0) {
            sum += values.get(i);
            n++;
        }

    return ((double) sum) / n;
}
publicstaticvoidmain(字符串[]args){
整数[]数组=新整数[]{3,2,-4,-7};
ArrayList ArrayList=新的ArrayList(Arrays.asList(array));
System.out.println(平均正(arrayList));
}
公共静态双平均值正(ArrayList值){
if(values==null | | values.isEmpty())
返回0.0;
整数和=0;
int n=0;
对于(int i=0;i0.0){
求和+=值。获取(i);
n++;
}
返回((双)和)/n;
}

因为你要除以n而不是计算正数。所以我必须将n=0,而不是将其称为.size()?是的,只要你找到一个正数,就增加n的值,因为你需要正数的平均值:)