使用方法参数查找数组最小值的优雅方法?

时间:2017-07-16 20:35:36

标签: java arrays parameters java-stream min

我正在寻找一种表达这种伪代码的优雅方式。对于我的作业,我无法更改方法签名或参数类型。

    private static int smallest(int... nums)
    {
        return Arrays.stream(nums).min().getAsInt();
    }

我尝试做的就是从方法调用中获取一个巨大的整数列表作为参数,并返回所有< int strong> int 参数。我已经尝试谷歌并阅读API以了解如何正确实现这一点,但我只是到目前为止。有人可以帮我在语法上纠正这个来正确编译和输出吗?

我无法正确发布格式化控制台错误,因此我将其作为我的OP的更新发布。回答@Marvin我在我的编译器中遇到这个错误...

Methods1.java:25: error: cannot find symbol
  int small = Arrays.stream(nums).min().getAsInt();
              ^
symbol:   variable Arrays
location: class Methods1
1 error

3 个答案:

答案 0 :(得分:4)

你几乎拥有它,它是getAsInt()而不是get()

private static int smallest(int... nums) {
    return Arrays.stream(nums).min().getAsInt();
}

完成working sample on ideone.com

import java.util.Arrays;

class Ideone {
    public static void main (String[] args) {
        int[] nums = new int[] { 7, -2, 5, 12 };
        System.out.println(smallest(nums));
    }

    private static int smallest(int... nums) {
        return Arrays.stream(nums).min().getAsInt();
    }
}

打印:

-2

答案 1 :(得分:1)

您可以像这样迭代整个数组

private static int smallest(int[] array)
{
    //check if the array is empty
    if(array.length == 0)
    {
        //handle, whatever happens if the array is empty
        return -1; //maybe you should throw an exception here 
    }

    //storing the smallest found value, start with the first int in the array
    int smallest = array[0];

    //the iteration
    for(int i : array)
    {
        //check if the current checked value is smaller than the smallest found...
        if(i < smallest)
        {
            //...and if it is, set it as the smallest found value
            smallest = i;
        }
    }
    //finally, return the smallest value
    return smallest;
}

这应解决您当前的问题,但在大多数情况下,我建议使用预先排序的数组或列表。如果其中的数据已按升序存储,则第一个元素始终为最低元素,最后一个元素始终为最高值。

答案 2 :(得分:0)

此方法使用 varargs 作为参数,获取无限未知的可变参数数量。将从main调用的所有参数组合到一个相同类型的数组中。这是为了解释main中原始方法调用的可变性。最后,返回所有参数的最小整数。

我是一个相当新的程序员,第二年进入计算机科学,我不确定这对任何人都有用,但我希望它有所帮助。感谢大家在这里提供您的精彩提示和错误捕获。我的问题是我忘了导入我的Array类,并且我的一个来自stream类的方法调用被错误命名。

最后,对于任何经验丰富的程序员来说,除了这个看起来活泼优雅之外,这句话的执行速度是否比执行一个简单的foreach循环并将num与最后一个最小的那个相比更快?

   import java.util.Arrays;

   public class Test
   {
       public static void main(String[] args)
       {
           // Enter as many as you want here, can be more or less than three
           int num1 = 23;
           int num2 = 89;
           int num3 = 9;

           // Apply each variable as an argument for the method call
           int smallestNumber = smallest(num1, num2, num3);
           // Print out variable value to prove it works
           System.out.print(smallestNumber);
       }

       private static Integer smallest(int... nums)
       {
           // Found an elegant way to do the stubbed out block of code
           // I left the code down there to show what is going on here
           try
           {
               return Arrays.stream(nums).min().getAsInt();
           }
           catch (Exception e)
           {
               return null;
           }


           // The above code is essentially doing the below code
           /*try
           {
               // Initialize Variable to start of array
               int smallest = nums[0];

               // For:Each Loop: go through each parameter and assign it a local variable to compare with
               for(int i : nums)
               {
                   // compare if smaller
                   if(i < smallest)
                   {
                       // If true, set as smallest
                       smallest = i;
                   }
               }
               return smallest;
           }
           catch (Exception e)
           {
               return null;
           }*/
       }
    }