2

我试图写一个简单的 max 和 min 方法,当我写它时,我不禁觉得它不应该这么复杂......也许我错了?我的最大代码是这样工作的,请原谅我糟糕的伪代码:

用 10 个随机数填充一个数组。创建一个初始化为 0 的最大变量,因为 0 是最低的最大值。将每个元素与最大值进行比较如果元素大于最大值,则将最大值替换为有问题的元素

我不喜欢我必须将 max 初始化为 0 的事实,我觉得可能有更好的方法呢?

我的 min 代码的工作原理类似,除了我:比较我的 min 低于数组元素。如果元素较低,请替换 min。

我真正不喜欢的是我必须将我的最小值初始化为最大随机数,在本例中为 50。

我的问题是:有没有更好的方法来做到这一点?有没有更有效的方法来编写这段代码?

import java.util.Random;

public class Main {

public static void main(String[] args) {

    //Declare min and max
    int max=0;
    int min;
    //Array of 10 spaces
    int[] ar=new int[10];
    //fill an array with random numbers between 0 and 50

    for(int i=0;i<10;i++)
    {
        ar[i]=new Random().nextInt(50);
    }

    //Test max algorithm
    //loop trough elements in array
    for(int i=0;i<10;i++)
    {
        //max is set to 0, there should always be a maximum of 0
        //If there isnt 0 will be the maximum

        //If element is greater then max
        //replace max with that element
        if(ar[i]>max)
        {
            max=ar[i];
        }
    }
    System.out.println("The max is "+ max);

    //Test min
    //Initialising min to maximum Random number possible?
    min=50;
    for(int i=0;i<10;i++)
    {
        if(ar[i]<min){
            min=ar[i];
        }
    }
    System.out.println("The min is "+min);


}

}

4

7 回答 7

6

您始终可以将数组的第一个元素(即numbers[0])作为初始值并从第二个元素开始循环。

int[] numbers = new int[10];
int max, min;
...
min = max = numbers[0];
for(int i = 1; i < numbers.length; ++i) {
    min = Math.min(min, numbers[i]);
    max = Math.max(max, numbers[i]);
}
于 2012-10-20T11:26:13.560 回答
5

好的,虽然其他人已经发布了答案,但我已经花时间将您的代码编辑成我认为更有用的东西。

  1. 制作静态方法。那些可以重复使用。
  2. 使用省略号 (...),因为您可以像在代码中一样调用数组参数的方法,也可以使用可变数量的参数作为min(5,3,8,4,1).
  3. 用数据类型提供的最小/最大可能数字初始化
  4. 要检查您的代码是否有效,您必须先打印出数组中的项目,因为当您不知道其中的内容时,就无法判断结果是否正确。
  5. 将您的代码基于标准库中的现有方法,因为众所周知,这些方法经过了彻底的测试并且可以有效地工作(我知道,min/max 看起来像一个太微不足道的例子)。
  6. 除非您真的可以证明您的代码中存在性能问题,否则我不会过多关注性能。优先级应该更像是第一正确性、第二可读性/可维护性、第三性能。

其他人已经提到了大部分内容,但无论如何,这是代码:

import java.util.Random;

public class MinMax {

    public static int min(int... args) {
        int m = Integer.MAX_VALUE;
        for (int a : args) {
            m = Math.min(m, a);
        }
        return m;
    }

    public static int max(int... args) {
        int m = Integer.MIN_VALUE;
        for (int a : args) {
            m = Math.max(m, a);
        }
        return m;
    }

    public static void main(String[] args) {

        // fill an array with random numbers between 0 and 50
        int[] ar = new int[10];
        for (int i = 0; i < 10; i++)
        {
            ar[i] = new Random().nextInt(50);
            System.out.println(ar[i]);
        }

        int maxValue = max(ar);
        int minValue = min(ar);

        System.out.println("The max is " + maxValue);
        System.out.println("The min is " + minValue);
    }
}
于 2012-10-20T11:37:18.003 回答
2

几个小贴士:

  1. 使用第一个元素初始化min并从第二个元素开始:

    int min = ar[0];
    for(int i=1;i<10;i++)
    
  2. ...或从:

    int min = Integer.MAX_VALUE;
    

    如果您希望您的数组可以是空的,这种方法会更好。

  3. 用于Math.min避免显式条件(有些人可能会说它更慢):

    for(int i=0;i<10;i++)
    {
       min = Math.min(min, ar[i]);
    }
    
于 2012-10-20T11:30:06.973 回答
1

当数字改变时,将最大值初始化为 0 和最小值为 50 将不起作用。更合适的方式是:
1. 将它们初始化为数组的第一个元素。
2. 使用length代替常数。

max = ar[0];  
    for(i=0;i<ar.length; i++)  
    {  
            if(ar[i]>max)  
            {  
                max=ar[i];  
            }  
    }

分钟相同:

min = ar[0];
for(i=0;i<ar.length; i++)
{
        if(ar[i]<min)
        {
            min=ar[i];
        }
}
于 2012-10-20T11:26:29.917 回答
0
public static void main(String[] args) {
     int[] myArray = {9, 7,9, -40, -10, 40};
    //int[] myArray = {};
    //int[] myArray = {4};
    System.out.println("Difference between max and min = "
            + findDifference(myArray));
}

// Find difference between Max and Min values for a given array
public static int findDifference(int[] arr) {

    if (arr.length == 0) {
        // Log
        System.out.println("Input Array is empty");

        return Integer.MIN_VALUE;
    }

    int min = arr[0];
    int max = arr[0];

    for (int i = 1; i < arr.length; i++) {
        if (arr[i] < min)
            min = arr[i];
        else if (arr[i] > max)
            max = arr[i];
        // Just to check if logic works fine
        System.out.println("Min=" + min + " Max=" + max);
    }

    return max - min;

}
于 2013-02-07T06:19:55.070 回答
0
import java.io.*;

public class MultiDimensionalArrayIO {

public static void main(String[] args)throws IOException {
BufferedReader c= new BufferedReader (new InputStreamReader (System.in) );

System.out.print ( "Enter Number Column : " );
int column = Integer.parseInt(c.readLine());
System.out.print ( "Enter Number Row : " );
int row = Integer.parseInt(c.readLine());

int array [][] = new int [column][row];
int max = array [0][0];
int min = array [0][0];
int sum= 0;
for ( int i=0 ; i < array.length; i++){   
for (int j=0 ; j<array[i].length; j++){
    System.out.print("Enter Array Values ["+i+"]["+j+"]: " );
    array[i][j]= Integer.parseInt (c.readLine()); 

        min = Math.min(min , array[i][j]);
        max = Math.max(max , array[i][j]);
        sum += array[i][j];
}    
}

    System.out.println("The Min Number :"+ min);
    System.out.println("The Max Number :"+ max+ " total is "+ sum);

}
}
于 2013-08-02T01:17:31.013 回答
0

根据您是否希望在同一方法中使用 max 和 min 函数,您还必须考虑返回类型。

到目前为止,大多数建议都将两者分开,这意味着可以返回一个 int。但是,如果将 max 和 min 函数放入 findLargestDifference 方法中,则必须返回 long 查看,因为 int 数组中任何给定数字之间的最大差异可能是 2 个 int 的大小。您还不必在 int 数组上循环两次。

此外,我建议为角落和边缘案例编写单元测试,而不是在主方法中打印。它有助于在实现逻辑时尽早测试您的逻辑,因此通常会使代码更清晰。

请参阅下面的示例代码。

public class LargestDifference {

public static long find(int[] numbers) {
    if (numbers == null || numbers.length == 0) {
        throw new IllegalArgumentException("Input cannot be null or empty.");
    }else {
        long currentMax = numbers[0];
        long currentMin = numbers[0];

        for (int i=0; i < numbers.length; i++) {
            if (currentMin > numbers[i]) {
                currentMin = numbers[i];
            }else if (currentMax < numbers[i]) {
                currentMax = numbers[i];
            }
        }
        return currentMax - currentMin;
    }
}
于 2015-09-21T09:44:25.993 回答