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

Java8流如何避免使用map或set过滤?[重复]

徐凌
2023-03-14

我不断遇到需要通过映射或集合保存状态的解决方案。e、 g.创建一个返回在输入中找到的重复项的方法

// non streams solution
public int[] getDuplicates(int[] input){
  Set<Integer> allSet = new HashSet<Integer>();
  Set<Integer> duplicates = new HashSet<Integer>();

  int[] dups = new int[input.length];
  int j = 0;
  for (Integer i : input) {
    if (!allSet.add(i)) {
      if(duplicates.add(i)) {
        dups[j++] = i;
      }
    }
  }
  return Arrays.copyOfRange(dups, 0, j);
}

我的Java8流解决方案,不幸的是,我正在使用哈希集进行过滤。我理解这并不“恰当”,因为这取决于州。没有州是建议还是硬性规定?这只是运行并行流时的问题吗?有人能推荐一种不使用哈希集的方法吗?

public static int[] getDuplicatesStreamsToArray(int[] input) {
  Set<Integer> allSet = new HashSet<>();
  int[] dups = Arrays.stream(input)
      .sequential()                   // prevents parallel processing
      .unordered()                    // speed up distinct operation
      .boxed()                        // int to Integer
      .filter(n -> !allSet.add(n))    // passes dups, but uses STATE
      .distinct()                     // uses internal Set of dups
      .mapToInt(i -> i)               // Integer back to int
      .toArray();
  return dups;
}

共有1个答案

谭玄天
2023-03-14

这个怎么样

基本上,创建 Map 类型的频率计数

    public static int[] getDuplicatesStreamsToArray(int[] input) {

      int[] dups = Arrays.stream(input).boxed().collect(
            Collectors.groupingBy(Function.identity(),
                  Collectors.counting())).entrySet().stream().filter(
                        e -> e.getValue() > 1).mapToInt(
                              e -> e.getKey()).toArray();
      return dups;
   }

我误解了你之前想做的事。

 类似资料:
  • 此问题是之前问题的后续:使用Streams添加BigDecimals 这个问题与使用Java8和Lambda表达式添加有关。在实现给出的答案后,我遇到了另一个问题:每当流为空时,方法都会抛出一个。 考虑下面的代码: 香草Java代码对空集合没有问题,但是新的Java8代码有问题。 在这里避免NSEE最优雅的方式是什么?当然,我们可以做到: 但是有没有一种Java的方法来处理空集合?

  • 如何使用java8流和过滤器过滤嵌套循环? 假设我有一个汽车列表(

  • 如何过滤<代码>地图 仅当列表中的任何员工具有字段值性别=“M”时,我才必须过滤。 输入:

  • 我想编写一个存储过程来将数据插入到表中,并检查是否已经存在相同的数据? 如果是,则异常抛出为已经存在。但我不知道应该在哪里添加异常。请帮忙。

  • 钱箱类: 商户类: 输入数据: 我的任务 计算每个商家的总金额并返回商家列表 我正在尝试使用Stream API解决这个任务。并编写了以下代码: 结果 但显然,流返回四个对象,而不是所需的两个对象。我意识到,地图(第二行)为每个cashBoxId创建了四个对象。而且我不知道如何通过进行过滤,也不知道如何获得没有重复的结果。

  • 我们使用了一个非常简单的流程,从PubSub检索消息,将其JSON内容扁平化为两种类型(对于BigQuery和Postgres),然后插入到两个接收器中。但是,我们在两个接收器中都看到了重复的情况(Postgres有点固定了,有一个唯一的约束和一个“关于冲突……什么都不做”)。 起初,我们信任Apache Beam/BigQuery创建的所谓“插入式”UUId。然后,在将消息排入PubSub之前,