【问题标题】:How to get multiple averages from ArrayList?如何从 ArrayList 获得多个平均值?
【发布时间】:2016-01-16 20:39:41
【问题描述】:

下面的代码从 0 到 100 生成 100 个排序的随机双精度数,然后从这 100 个数字中计算平均值 (avg)。我的意图是从这些数字中计算 10 个平均值,然后对它们进行排序,但在许多尝试中,我得到了 100 个排序的随机数字或 1 个平均值 :(

如何获得这 10 个排序后的平均值?

public class NewMain {
    private static Random rand = new Random();

    public static void main(String[] args) {
        System.out.println(Arrays.toString(sortowacz(100, 0, 100)));
    }

    public static Object[] sortowacz(final double length, final double min,
                                     final double max) {
        List<Double> nieposortowanaLista = randList(length, min, max);

        Collections.sort(nieposortowanaLista);
        return nieposortowanaLista.toArray();
    }

    private static List<Double> randList(final double length, final double min,
                                         final double max) {
        List<Double> list = new ArrayList<>();
        List<Double> avg = new ArrayList<>();
        double sum = 0.0;

        for (int i = 0; i < length; i++) {
            list.add(min + (max - min) * rand.nextDouble());
        }

        for (int i = 0; i < list.size(); i++) {
            sum += list.get(i);
        }

        avg.add(sum / list.size());

        return list;
    }
}

【问题讨论】:

  • 10 averages 的平均值是多少? :)
  • 如果您要求人们阅读您的代码,能否正确缩进?
  • 无论多长,您总是需要 10 个平均值?
  • @Dzmitry Paulenka 它们是 100 个随机生成数字的平均值
  • @Noor Nawaz 不,可能是从 10 到 1000

标签: java list random arraylist


【解决方案1】:

这是您需要的代码,它计算 100 个平均值中的 10 个并在最后对它们进行排序

public class TestAverages {

public static void main(String... args) {

    List<Double> averages = sortowacz(1000, 0, 100);
    averages.forEach(System.out::println);
}

public static List<Double> sortowacz(final double length, final double min, final double max) {
    List<Double> list = new ArrayList<>();
    Random rand = new Random();
    for (int i = 0; i < length; i++) {

        list.add(min + (max - min) * rand.nextDouble());
    }

    List<Double> averages = new ArrayList<>();
    while (!list.isEmpty()) {
        List<Double> subList = list.subList(0, (int) (length/10));
        double avg = subList.parallelStream().mapToDouble(d -> d).average().getAsDouble();
        averages.add(avg);
        list.removeAll(subList);
    }
    return averages;
 }
}

【讨论】:

  • 谢谢!它工作正常,但我不明白一件事:如果我从 100 个随机数 (sortowacz(100, 0, 100)) 中设置 10 个平均值 (list.subList(0, 10)) 它给了我我的期望。但是,当我想从 1000 个数字中创建例如 10 个平均值(我将其设置为:list.subList(0, 10) 和 sortowacz(1000, 0, 100))时,它会给我 100 个看起来很奇怪的平均值 :( 为什么就这样?
  • 我已经编辑了代码,它不适用于 1000 或任何其他数字
  • 是的,但现在分散这些平均值是错误的。当我对它们进行排序(Collections.sort(averages))时,我注意到第一个平均值约为 0,最后约为 99。当从 0 到 100 的一组随机数中生成平均值时,它的预期值在 46 到 54 之间:(
【解决方案2】:

我不知道你的多重平均值是多少,但要得到一个你可以使用的

List<Double> list=new ArrayList<>();

double average =    list.stream().mapToDouble(d->d).average().getAsDouble();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-25
    • 2012-03-18
    • 2022-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    相关资源
    最近更新 更多