我们如何使用地图从双数组中获得唯一元素‽

我目前正在解决以下编程问题:Find the unique number语句是:

  

有一个包含一些数字的数组。所有数字都相等,除了   一。尝试找到它!

     

Kata.findUniq(new double [] {1,1,1,2,1,1}); // => 2   Kata.findUniq(new double [] {0,0,0.55,0,0}); // => 0.55

     

保证数组包含3个以上的数字。

     

测试包含一些非常大的数组,因此请考虑性能。

首先,我的想法是获取所有元素的频率作为映射,然后返回频率值为1的键。

我写了以下内容:

import java.util.stream.*;

 public class Kata {
    public static double findUniq(double arr[]) {

      Map<Double,Long> frequencies = Arrays.stream(arr)
        .collect(Collectors.groupingBy(n -> n,Collectors.counting()));

      System.out.println("Map: "+map);

    }
}

因此它输出:

./src/main/java/Kata.java:8: error: method collect in interface DoubleStream cannot be applied to given types;
        .collect(Collectors.groupingBy(n -> n,Collectors.counting()));
        ^
  required: Supplier<R>,ObjDoubleConsumer<R>,BiConsumer<R,R>
  found: Collector<Object,CAP#1,Map<Object,Long>>
  reason: cannot infer type-variable(s) R
    (actual and formal argument lists differ in length)
  where R is a type-variable:
    R extends Object declared in method <R>collect(Supplier<R>,R>)
  where CAP#1 is a fresh type-variable:
    CAP#1 extends Object from capture of ?
./src/main/java/Kata.java:10: error: cannot find symbol
      System.out.println("Map: "+map);
                                 ^
  symbol:   variable map
  location: class Kata
2 errors

我想解决这个问题的方法是了解:

required: Supplier<R>,Long>>

我确实知道它期望:Supplier<R>,R>,而我正在写:Collector<Object,Long>>,但这意味着什么?我们该如何解决?为什么会生成?

然后我尝试了第二种方法:使用HashSet获取所有唯一的double,然后删除非唯一的double,然后返回唯一的double(存储在HashSet中)。

import java.util.*;
import java.util.stream.*;

 public class Kata {
    public static double findUniq(double arr[]) {
      System.out.println("\nOriginal array: "+Arrays.toString(arr));

      Set<Double> unique = new HashSet<Double>();
      double repeated = Double.MIN_VALUE;

      for(int i = 0; i < arr.length; i++){
        if(repeated != arr[i] && !unique.add(arr[i])){
          repeated = arr[i];
        }
      }
      unique.remove(repeated);
      System.out.println("Set: "+Arrays.toString(unique.toArray()));
      return (double)unique.toArray()[0];
    }
}

我的问题是,如何使用第一种方法返回唯一元素,并通过映射计数频率,然后返回值为1‽的键。

我也读过:

Java Hashmap: How to get key from value? How to get unique items from an array?

zhw_19890108 回答:我们如何使用地图从双数组中获得唯一元素‽

发生编译器错误是因为您使用的CollectorDoubleStream(原始Stream的专用double类型)上不起作用。您可以做的是先将DoubleStream变成Stream<Double>,然后应用Collector

Map<Double,Long> frequencies = Arrays.stream(arr)
        .boxed() // this is the key method to call
        .collect(Collectors.groupingBy(n -> n,Collectors.counting()));

然后,您需要找到值为1的KVP,但是地图并不是真的要这样做:

System.out.println("Map: "+ 
    frequencies.entrySet().stream()
        .filter(x -> x.getValue() == 1)
        .findFirst().get().getKey());

请注意,有比这更快的解决方案。请记住,正好一个两倍是不同的!

,

使用Set(仅包含唯一元素)可以更轻松地完成此操作。以下是完整的代码:

import java.util.Arrays;
import java.util.Iterator;
import java.util.Set;
import java.util.stream.Collectors;

public class PrintSubarrayMain {

    public static void main(String args[]) {
        int [] arr= {1,1,2,1};
        Set<Integer> set = Arrays.stream(arr).boxed().collect(Collectors.toSet());  
        Iterator<Integer> itr=set.iterator();
        if(itr.hasNext()) {
            int first = itr.next();
            if(isRepeated(arr,first) && itr.hasNext())
                System.out.println("The unique element is: "+itr.next());
            else
                System.out.println("The unique element is: "+first);
        }               
    }
    static boolean isRepeated(int arr[],int n) {
        int count=0;
        for(int i=0;i<arr.length;i++) {
            if(arr[i]==n)
                count++;
            if(count>1)
                return true;
        }
        return false;
    }
}

输出:

The unique element is: 2
本文链接:https://www.f2er.com/3087033.html

大家都在问