首页 > 解决方案 > 有没有办法创建一个具有 ArrayList 的动态功能的 int[]?(颗粒大小分布)

问题描述

所以我正在尝试实现一种方法,该方法返回一个包含粒子大小分布的数组(其中粒子的大小是像素的数量)。我尝试的是使用和 int[] 并将其设置为不同的长度以尝试匹配粒子的最大/最小尺寸。我很快得出结论,这不是要走的路,因为尺寸变化很大。我基本上需要的是一个大小动态的 int[]。

到目前为止我已经尝试过:

该地图具有每个粒子的标签(整数)(像素列表)

private int[] particleSizeDistribution(Map<Integer, List<Pixel>> particleMap) {
        int[] particleSizeDistribution = new int[tried many different lengths here :)];

        for(Map.Entry<Integer, List<Pixel>> entry : particleMap.entrySet()) {
            particleSizeDistribution[entry.getValue().size()] += 1;  
        }
        return particleSizeDistribution;
    }

这些粒子是从显微镜的一系列图像中生成的。使用 int[] 的问题是我需要选择一个固定的长度。一项实验可能会显示 20-200 像素范围内的粒子,然后是 100-1500 像素。

我知道 ArrayLists 是动态的,我尝试使用它,但是如果第一个粒子的大小为 125 像素(意味着在索引 125 处 +1)并且列表为空怎么办?当我尝试时没有工作。

希望有人能让我朝着正确的方向前进!

周末愉快 :)

标签: javaarrays

解决方案


正如评论中所建议的,最好将现有地图重新映射到Map<Integer, Integer>键将是List<Pixel>使用Collectors.groupingBy+大小的位置Collectors.summingInt

SortedMap<Integer, Integer> particleSizeMap = particleMap.entrySet().stream()
        .collect(Collectors.groupingBy(
            e -> e.getValue().size(), 
            TreeMap::new, // sort by the particle list size
            Collectors.summingInt(e -> 1)
        ));

然后可以使用排序后的映射来构建一个数组:

int[] particleSizeDistribution = IntStream.rangeClosed(0, particleSizeMap.lastKey())
        .map(i -> particleSizeMap.getOrDefault(i, 0))
        .toArray();

推荐阅读