【问题标题】:UniqueElement Counter JavaUniqueElement 计数器 Java
【发布时间】:2016-06-17 04:36:50
【问题描述】:

我刚刚开始了 Java 数据结构暑期课程。分配的问题之一是我不是计算数组中的所有元素,而是找到每个唯一元素。

numUnique(new double[] { 11, 11, 11, 11, 22, 33, 44, 44, 44, 44, 44, 55, 55, 66, 77, 88, 88 })==8

numUnique(new double[] { 11, 22, 33, 44, 55, 66, 77, 88})==8

在上面的第一个示例中,11 被列出 4 次,22 一次,33 一次,44 5 次,66 一次,77 一次,88 两次。数组中有 17 个元素,但只有 8 个不同的数字。这两个示例给出了相同的输出 8,这就是我应该找到的数字。

【问题讨论】:

  • 有很多方法可以回答这个问题。您能告诉我们到目前为止您已经尝试过什么,或者您应该采取哪种方法?
  • 我所拥有的只是计算数组中所有元素的函数。我不知道如何在评论中发布代码。

标签: java arrays


【解决方案1】:

在 Java 8 中有一种非常简单的方法可以做到这一点,无需任何中间集合:

List<Double> unique = Arrays.stream(array).distinct()
    .collect(Collectors.toList());

如果您只想要唯一元素的数量,或者将收集器替换为 count()

【讨论】:

  • 这个实现只解决了多少个唯一数字的问题,而不是你的唯一数字是多少
【解决方案2】:

两种直接的方法是将数组添加到集合中(这将根据定义删除重复项),或者使用数字作为键将每个数字添加到哈希图中。

使用集合:

double[] input = new double[] {11, 11, 11, 11, 22, 33, 44, 44, 44, 44, 44, 55, 55, 66, 77, 88, 88};
Set<Double> set = new HashSet<Double>(Arrays.asList(input));
System.out.println("There were " + set.size() + " unique numbers in the set.");

使用地图:

Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i=0; i < double.length; ++i) {
    map.put(i, null);
}
System.out.println("There were " + map.keySet.size() + " unique numbers in the set.");

【讨论】:

    【解决方案3】:

    在 Java 中跟踪唯一项目的最简单方法之一是使用 HashMap 实现。

    您需要的 API 是:containsKey() 和 put()。已阅读下面的 API 文档。 https://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html

    示例实现:

    import java.util.HashMap;
    import java.util.Map;
    
    public class test {
        public static void main(String[] args) {
            double[] value1 = new double[] { 11, 11, 11, 11, 22, 33, 44, 44, 44, 44, 44, 55, 55, 66, 77, 88, 88 };
            Map<Double, Integer> numberTracker = new HashMap<>();
    
            for(Double value : value1) {
                if (!numberTracker.containsKey(value)) {
                    numberTracker.put(value, /*dummy value=*/1);
                }
            }
    
            for (Map.Entry<Double,Integer> entry : numberTracker.entrySet()) {
                System.out.println(entry.getKey());
            }
        }
    }
    

    注意:由于您有一个双精度数组,因此输出将是双精度数据类型。也就是说,它将类似于; [33.0、66.0、77.0、11.0...]

    您可以通过将数组更改为整数类型或找到将双精度值转换为整数的方法来解决双精度类型问题。

    由于这应该是一道作业题,我将把最后一点留给你。

    【讨论】:

      猜你喜欢
      • 2013-02-18
      • 1970-01-01
      • 2020-03-08
      • 2013-12-11
      • 2016-07-01
      • 2020-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多