当前位置: 首页 > 知识库问答 >
问题:

使用Collections.frequency打印特定值()

田晨
2023-03-14

我有一个如下数组:

int[] array = {11, 14, 17, 11, 48, 33, 29, 11, 17, 22, 11, 48, 18};

我想做的是找到重复的值,并打印它们。

所以我这样做的方法是转换到ArrayList,然后转换到Set,并在Set上使用stream

ArrayList<Integer> list = new ArrayList<>(array.length);
for (int i = 0; i < array.length; i++) {
    list.add(array[i]);
}

Set<Integer> dup = new HashSet<>(list);

然后,我使用一个循环通过它,并使用集合打印值。频率

dup.stream().forEach((key) -> {
            System.out.println(key + ": " + Collections.frequency(list, key));
        });

这当然会把它们全部打印出来,即使计数是一。

我想加入if(键

在这个实例中,我如何获得仅在value的位置打印的值

我可能会说:

int check = Collections.frequency(list, key);
            if (check > 1) {

但是这会复制中的Collections.frequency(list, key),并且非常难看。


共有3个答案

羊舌琛
2023-03-14

集合的问题。频率是指它必须遍历所有集合才能找到给定元素的频率。如果对集合中的每个元素执行此操作,则解决方案是O(n^2),即效率极低,因为处理时间随着集合中元素数的平方而增加。

相反,您可以使用流创建一个映射来计算每个元素的出现次数,如下所示:

int[] array = {11, 14, 17, 11, 48, 33, 29, 11, 17, 22, 11, 48, 18};

Map<Integer, Long> occurrences = Arrays.stream(array)
    .boxed()
    .collect(Collectors.groupingBy(
        Function.identity(), 
        Collectors.counting()));

现在,如果您想只保留超过1次出现的值,您可以简单地删除值等于1的map条目:

occurrences.values().removeIf(v -> v == 1);

最后,如果打印地图:

System.out.println(occurrences);

您将获得以下输出:

{48=2, 17=2, 11=4}

或者,要获得预期格式的输出:

occurrences.forEach((k, v) -> System.out.println(k + ": "+ v));

另一种方式,短得多并且没有流的开销:

Map<Integer, Long> occurrences = new HashMap<>();
for (int n : array) occurrences.merge(n, 1L, Long::sum);

然后,如前所示删除唯一元素的条目:

occurrences.values().removeIf(v -> v == 1);
高慈
2023-03-14

完整的示例无需在循环中初始化dup并为每个唯一元素调用Collections.frequency一次:

Integer[] array = {11, 14, 17, 11, 48, 33, 29, 11, 17, 22, 11, 48, 18};
List<Integer> list = Arrays.asList(array);
Arrays.stream(array).collect(Collectors.toSet())
  .stream()
  .map(v -> new SimpleEntry<>(v, Collections.frequency(list, v)))
  .filter(v -> v.getValue() > 1)
  .forEach(v -> System.out.println(v.getKey() + ":" + v.getValue()));
籍昱
2023-03-14

也许你可以使用filter来只得到大于2的值:

dup.stream()
       .filter(t -> Collections.frequency(list, t) > 2)
       .forEach(key -> System.out.println(key + ": " + Collections.frequency(list, key)));

您的案例结果是:

11: 4

编辑

另一个解决方案:

不需要使用SetCollections.frequency,您只需使用:

Integer[] array = {11, 14, 17, 11, 48, 33, 29, 11, 17, 22, 11, 48, 18};
Arrays.stream(array).collect(Collectors.groupingBy(p -> p, Collectors.counting()))
        .entrySet().stream().filter(t -> t.getValue() > 1)
        .forEach(key -> System.out.println(key.getKey() + ": " + key.getValue()));

输出

48: 2
17: 2
11: 4
 类似资料:
  • 问题内容: Java中有什么方法可以打印到特定的IPP打印机?我发现所有示例代码和教程都集中在如何使用以下类似内容打印特定类型的文档上: 此代码段仅打印到找到的第一台能够打印文档的打印机。就我而言,我想通过其URI查找打印机,但似乎不支持此功能。我尝试使用,而不是,并添加了一个属性,但这不会返回任何打印机。我怀疑查找服务正在寻找可以更改其目标URI的打印机,而不是寻找具有该URI的打印机。 作为最

  • 问题内容: 我有一个文本文件,需要将其打印到特定的网络打印机。我知道打印机的名称。 到目前为止,我已经创建了Printable类来打印文件(票证)。 我这样称呼TicketPrintPage: 它的工作原理还不错,但是: -我的文本不多于一页(找到了一些算法,但是很好) -我不知道打印机何时完成打印,如果我尝试打印两页如果打印机连续打印了多张票证,则会返回“打印机未就绪”消息。 所以问题又来了:没

  • 问题内容: 我有一个PDF文档,我想用我的python应用程序打印它。 我在这里尝试了解决方案(使用python的win32print模块打印PDF文档吗?),但是当我安装Ghostscript 9.15(即实际版本)时,它没有 我使用该命令的方式起作用,但是它会打开默认查看器(我的浏览器是Adobe Reader),并且在打印后它仍然保持打开状态,试图通过杀死其他打开的窗口来终止该进程,但我不希

  • 我有这个JSON: 我想打印键值对,其中键匹配状态和选项,以及时间和它的值。我可以通过使用下面的命令打印时间和所有键值对,但不确定如何提取特定的键值对。 这将产生以下输出: 但我想要的结果是:

  • 假设我有一个包含3张工作表的工作簿,“工作表1”、“工作表2”和“工作表3”。现在我只想打印“第1页”,所以在VBA我用了 但宏仍然打印所有3个工作表。当我专门编写只打印1的代码时,发生了什么导致它打印所有3张纸? 我正在使用: 微软卓越卓越专业增强版 2010

  • 问题内容: 我想使用PDFBox打印 由iText创建的 PDF文件 。我已经使用PDDocument类及其方法print()成功尝试了此操作。您可以在此处找到文档: http //pdfbox.apache.org/apidocs/。 (我正在使用此代码:) 方法print()很好用,但是 有一个问题:当我需要打印多个文件时,该方法要求我为每个文档选择打印机。 有什么办法只能设置一次打印机吗?