获取 Arraylist 中最常见的元素

Posted

技术标签:

【中文标题】获取 Arraylist 中最常见的元素【英文标题】:Get the most common element of an Arraylist 【发布时间】:2022-01-18 01:46:14 【问题描述】:

我有一个来自类型 Cell 的 ArrayList。 ArrayList 具有来自 Excelsheet 的单元格的值。 我已经尝试了该站点的不同解决方案,但其中没有一个是正确的。 这就是为什么我没有代码来告诉你我做了什么。 几乎所有解决方案都适用于String

我需要在我的 ArrayList 中获取最常见的值。

我尝试用cell.getNumericValue() 替换解决方案中的Strings 并更改Double 的类型,但没有成功。

有人可以解决我的问题吗?


Map<Cell, Long> f = dataaccx
                .stream()
                .collect(Collectors.groupingBy(v -> v, Collectors.counting()));
        Cell maxOccurence =
                Collections.max(f.entrySet(), Comparator.comparing(Map.Entry::getValue)).getKey();

        System.out.println(maxOccurence.getNumericCellValue());

这是我尝试的一个示例。 dataaccx 是我的数组列表。

【问题讨论】:

你没有代码是因为没人给你吗?你认为这就是学习编码的方法吗? 我编辑了它,我觉得我写的有误会。我的意思是没有解决方案对我有用。我尝试使用这里的解决方案,但没有奏效。 如果单元格值有多个相同出现频率的不同值,您建议应该发生什么? IE。最常见的值是 3 和 4,它们出现的次数相同。 @M.Gianota 如果有多个不同的值,则应该打印两个值 @Unmitigated 它打印的数字不正确。我在我的 Excelsheet 中检查了它,但它没有打印正确的数字。我认为它会打印第一个副本,但我不确定 【参考方案1】:

您应该按单元格的数值而不是对象本身进行分组。

Map<Double, Long> f = cells
        .stream()
        .collect(Collectors.groupingBy(Cell::getNumericCellValue, Collectors.counting()));
Map.Entry maxOccurence =
        Collections.max(f.entrySet(), Comparator.comparing(Map.Entry::getValue));
System.out.println(maxOccurence.getKey());

【讨论】:

它找不到方法getNumericvalue 它是Apache POI 的给定方法。我不是自己创造的。 @Nando94 那么方法名称是什么?如何从单元格中提取值? 对不起getNumericCellValue 我想我写错了。 @Nando94 在这种情况下将方法引用更改为Cell::getNumericCellValue @Nando94 如果这解决了您的问题,请考虑accepting。【参考方案2】:

如果多个最常见的值是可能的并且需要打印,那么构建频率图并在构建地图时使用普通循环在单次运行中找到最大频率可能会更好。

然后可以应用 Stream API 来打印结果。

int max = 0;
Map<Double, Integer> freqMap = new LinkedHashMap<>();
for (Cell c : cells) 
    int freq = freqMap.merge(c.getNumericCellValue(), 1, Integer::sum);
    if (freq > max) 
        max = freq;
    

final int maxFreq = max; // max is not final and cannot be used in lambda below
freqMap.entrySet()
    .stream()
    .filter(e -> e.getValue() == maxFreq)
    .map(Map.Entry::getKey)
    .forEach(System.out::println);

【讨论】:

以上是关于获取 Arraylist 中最常见的元素的主要内容,如果未能解决你的问题,请参考以下文章

python 获取数组中最常见的元素。

总结软件开发过程中最常犯的10个问题

集合ArrayList

ArrayList集合

java集合ArrayList

java ArrayList集合