我不明白这段代码有什么问题
public static void main(String[] args) {
Float[] arr = new Float[6];
arr[0] = 8.25F;
arr[1] = 8.25F;
arr[2] = 8.25F;
arr[3] = 0.0F;
arr[4] = 0.0F;
arr[5] = 0.0F;
secondHighest(arr);
}
public static float secondHighest(Float[] arr) {
float largest = arr[0];
float secondLargest = Float.NEGATIVE_INFINITY;
for (int i = 0; i < arr.length; i++) {
if (arr[i] > largest) {
secondLargest = largest;
largest = arr[i];
} else if (arr[i] > secondLargest) {
secondLargest = arr[i];
}
}
System.out.println(secondLargest);
return secondLargest;
}
打印8.25是最大值。而不是0.0
更新 我不想使用任何集合类。因为我不想改变数组元素的顺序。 如果所有输入都相同,我的方法应返回0.0 (这是float的默认值)作为输出。
答案 0 :(得分:4)
如果该值不大于之前的最大值,那么在设置第二大值之前,您不会检查它是否等于之前的最大值:
public static float secondHighest(Float[] arr) {
float largest = arr[0];
float secondLargest = Float.NEGATIVE_INFINITY;
boolean foundSecondLargest = false;
for (int i = 0; i < arr.length; i++) {
if (arr[i] > largest) {
secondLargest = largest;
largest = arr[i];
foundSecondLargest = true;
} else if ( arr[i] != largest && arr[i] > secondLargest) {
secondLargest = arr[i];
foundSecondLargest = true;
}
}
if ( !foundSecondLargest )
secondLargest = 0.0F;
System.out.println( String.format("%.2f", secondLargest ) );
return secondLargest;
}
修改强>
添加了一项检查,看是否找不到第二个最大值,如果是,则返回0.0F
。
答案 1 :(得分:3)
你为什么不这样做:
Float[] arr = new Float[6];
arr[0] = 8.25F;
arr[1] = 8.25F;
arr[2] = 8.25F;
arr[3] = 0.0F;
arr[4] = 0.0F;
arr[5] = 0.0F;
List<Float> list = Arrays.asList(arr);
Collections.sort(list);
Float secondLargest = Float.NEGATIVE_INFINITY;
if (list.size() > 1) {
secondLargest = list.get(1)
}
如果您不想使用任何集合实用程序类,则可以(冒泡)对数组进行排序并返回第二个元素。
答案 2 :(得分:3)
这里的许多答案都建议对数据集进行排序并获得第二个元素。这是一个很酷的解决方案,因为你可以用几行来解决你的问题。如果你有一个庞大的数据集会发生什么?在这种情况下,这些解决方案会不必要地增加您的代码时间复杂度。
你的问题是你有重复的值,所以你的第二大值也是8.25。
您应该更改“else-if”条件,以便第二大条件不能等于最大值。
答案 3 :(得分:2)
试试这个:
Arrays.sort(arr);
System.out.println(arr[1]);