【问题标题】:java - convert primitive double array to collectionjava - 将原始双精度数组转换为集合
【发布时间】:2016-03-06 09:11:26
【问题描述】:

我希望有一个浮点数(双精度)和整数数组,如下所示 -

double[] myArr = {0, 0, 95, 9.5, 19, 610.5, 1217, 5.14, 4038.66, 10.23, 7961, 828, 199858, 37325.3};

然后我有这个返回最大值和最小值的函数

    public static void getMaxArrVal(double[] myArr) {           

        myCol = /* Code to convert myarr to collection should come here */
        System.out.println(Collections.min(myCol ));
        System.out.println(Collections.max(myCol ));
    }
}

getMaxArrVal(myArr);

我在将原始数据类型转换为集合时遇到问题。我尝试将其转换为双列表,尝试将 myArr 转换为 char/String 以检查一些内容,但显然没有任何效果。

我不断看到原始数据类型的编译错误。我也尝试过Double,但没有运气。

我怎么可能将数组转换为集合并计算这个数组的最小值/最大值。如有任何帮助,我将不胜感激。

【问题讨论】:

标签: java


【解决方案1】:

这适用于 Java 8:

Arrays.stream(myArr).boxed().collect(Collectors.toCollection(ArrayList::new));

当然,可以使用任何Collection 代替ArrayList。我这里的代码实际上可能简化为Collectors.toList()

另外,如@nukie's answer 中所述,DoubleStream 有自己的min()max() 方法,导致转换无用。只需使用使用Arrays.stream(myArr) 创建的两个流并调用这些方法。

【讨论】:

    【解决方案2】:

    Guava 提供了很好的解决方案

    Lists.newArrayList(double[])
    

    【讨论】:

      【解决方案3】:
      double[] primitives = new double[] { 1.0, 2.0, 3.0};
      List<Double> objects = new ArrayList<>();
      for(double num : primitives) {
          objects.add(num);
      }
      

      【讨论】:

        【解决方案4】:

        使用 Arrays.sort 将按升序对数组进行排序。因此,您知道最小值将是数组 myArr[0] 的第一个元素,而最大值将是数组 myArr[myArr.length-1] 中的最后一个元素。

        double[] myArr = {0, 0, 95, 9.5, 19, 610.5, 1217, 5.14, 4038.66, 10.23, 7961,  828, 199858, 37325.3};
        Arrays.sort(myArr);
        System.out.println(myArr[0]);
        System.out.println(myArr[myArr.length-1]);
        

        以下将导致

        0.0

        199858.0

        【讨论】:

        • 这种方法会改变原始数组的顺序。但如果 OP 不在乎 - 完美的解决方案。
        • 谢谢迈克。我需要数组顺序保持不变。
        【解决方案5】:

        如果您在 java8 上运行此代码,您可以尝试 lambdas:

        Arrays.stream(myArr).max();
        

        Arrays.stream(myArr).max();
        

        【讨论】:

        • 请检查您的拼写以及您的代码。这不起作用,因为像生成的DoubleStream 这样的原始流在其collect() 方法中不接受Collectors。 Stream 不拼写为 straem。
        • 感谢您的评论! DoubleStream 没有提供 collect(Collector) 方法,这让我感到意外)
        • 这没有多大意义,因为Collectors 是通用的,你不能拥有Collector&lt;double, X, X&gt;。尽管如此,我们都希望有时这样的事情是可能的。
        【解决方案6】:
        public static void main(String[] args) throws Exception {
        
            Double [] myArr = {0., 0., 95., 9.5, 19., 610.5, 1217., 5.14, 4038.66, 10.23,  7961., 828., 199858., 37325.3};      
        
            Double min = Arrays.stream(myArr).min(Comparator.<Double>naturalOrder()).get();
            Double max = Arrays.stream(myArr).max(Comparator.<Double>naturalOrder()).get();
        
            System.out.println(min);
            System.out.println(max);
        }
        

        如果您不需要收集其他任何东西,除了找到maxmin,直接从数组创建流。在这种情况下,您根本不需要创建单独的集合。

        【讨论】:

        • 不要忘记Stream 对象只能使用一次。只需使用Arrays.stream(myArr) 两次...
        • @YassinHajaj 我做到了。你是对的。感谢您的评论。
        • 谢谢肯。我更喜欢double,因为我用这种类型写了很多代码。所以Double 在这种情况下不太适用。但是,这对我来说是一个很好的未来参考。谢谢
        猜你喜欢
        • 2011-07-07
        • 2015-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-20
        • 1970-01-01
        相关资源
        最近更新 更多