2014-02-21 51 views
-1
int playerOne = 4; 
int playerTwo = 8; 
int playerThree = 2; 
int playerFour = 8; 

public static int max(int p1, int p2, int p3, int p4) { 
    if(p1 > p2 && p1 > p3 && p1 > p4){ 
     return p1; 
    } else if (p2 > p1 && p2 > p3 && p2 > p4) { 
     return p2; 
    } else if ... 


} 

我在想,是以更少的重复性重新创建上述函数的更好方法。如何从整数列表中找到最大值

谢谢。

+1

可能是代码审查一个更好的问题。 – Dom

+0

哦,对不起,我需要将它移到或更改标签。 – jackdh

+0

我想知道是否有办法让Hotspot为广义案例生成SIMD指令。 –

回答

6
public static int max(int[] integers) { 
    int max = Integer.MIN_VALUE; 
    for (int e : integers) max = Math.max(max, e); 
    return max; 
} 

现在对于这也可能返回有关变量名执行信息:

//Returns the array index of the maximum integer 
public static int max(int[] integers) { 
    int max = Integer.MIN_VALUE; 
    int retVal = -1; 
    if (integers == null) return retVal; //needs to handle this case too 
    for (int i = 0; i < integers.length; i++) { 
     max = Math.max(max, integers[i]); 
     if (integers[i] == max) retVal = i; 
    } 
    return retVal; 
} 

这些实现也有能够处理任何大小的数组,而不是仅仅4

+1

@ La-comadreja你应该使用'integers'中的一个值来初始化'max',而不是'Integer.MIN_VALUE'。 'Integer.MIN_VALUE'甚至不存在于你的输入数组中,所以如果你的输入数组是空的,它将返回错误的'Integer.MIN_VALUE'。 –

+0

@Yatendra,如果整数是空的或为空呢?第二个实现更改为处理null。打印Integer的原因。MIN_VALUE(或retVal == -1)是它清楚地表明数组没有值。 –

+0

@Yatendra,第二个实现返回一个索引(请参阅方法上方的注释),并且索引在Java中不能为负数。 –

1
优势
public static int max(int[] integers) { 
    int max = integers[0]; 
    for (int i = 1; i < integers.length; i++) 
     max = Math.max(max, integers[i]); 
    return max; 
} 
+1

@ La-comadreja有一个更好的解决方案,迭代器是非常多的第二十一世纪:-) – zmo

+1

除了空阵列的风险,这是有道理的 – Leo

+1

@zmo没有使用迭代器背后的原因。我用数组中的第一个整数初始化'max'值。理想情况下应该是这种情况,而不是使用一些甚至不存在于输入数组中的值来初始化'max'。 –

0

只是为了它的乐趣,我给出了递归的方式,它没有比其他选项更好,但它很有趣;-)

public static int get_max(int[] integers) { 
    switch (integers.length) { 
     case 0: 
      throw new IllegalArgumentException(); 
     case 1: 
      return integers[0]; 
     case 2: 
      return Math.max(integers[0],integers[1]); 
     default: 
      return Math.max(integers[0], get_max(Arrays.copyOfRange(integers, 1, integers.length-1)); 
    } 
} 

afaict它应该工作,但它不是有效的内存,因为它在每次递归复制数组(少一个值),并为每次递归的每个函数调用消耗内存。

<3

2

与Java 8,这将是:

private int max(int... ints) { 
    if (ints.length == 0) { 
     throw new IllegalArgumentException(); 
    } 
    return Arrays.stream(ints).max().getAsInt(); 
} 

说明步骤:

  1. 确保ints.length > 0
  2. 创建一个IntStream
  3. IntStream上获得最大值max()
  4. 获取int并返回max()返回的OptionalInt

我希望它有助于未来的参考。

+0

喜欢它,你让我今晚学到了新东西,谢谢! – zmo

1

如果您使用的包装类Integer,你可以这样做:

public static int max(Integer... values){ 
    return Collections.max(Arrays.asList(values)); 
}