java - 有没有办法创建一个具有 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)并且列表为空怎么办?当我尝试时没有工作。
希望有人能让我朝着正确的方向前进!
周末愉快 :)
解决方案
正如评论中所建议的,最好将现有地图重新映射到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();
推荐阅读
- c++ - c++中的动态分配问题,仅适用于第一次迭代
- node.js - 在 mongo db 集合中给出未定义的值
- rubygems - 如何选择实时推送通知 API
- visual-c++ - 为什么在我的静态库的 DUMPBIN.exe 输出中,`malloc` 和 `free` 被列为 `External` 和 `UNDEF`?
- wordpress - 删除特定角色的 wp 管理栏节点 - $wp_admin_bar->remove_node( 'string' );
- rest-assured - 放心:如何将给定的值从一个端点传递到另一个端点?
- c# - NpgsqlException:dotnet ef 数据库更新上的“未知消息代码:74”
- python - 如果我在 HPC 上使用 Dask-Jobqueue,我还需要使用 Dask-ML 来运行 scikit-learn 代码吗?
- ionic-framework - 带有图像的 Ionic 4 输入装饰器
- python - 如何使用 Selenium 和 Python 处理 try 循环中的错误