我试图找到数组中的最小值和最大值。用于查找最大值的for循环正常工作(它打印100),但是,获取最小值的for循环打印多个数字(95,87,85,78)。我已经尝试更改System.out的放置位置以及使用带有int返回值的Method并继续显示多个值。
感谢任何帮助。
public static void main(String[] args) {
int[] scores = {99, 95, 87, 100, 94, 85, 78, 84, 97, 91};
int min = scores[0];
int max = scores[0];
for (int i = 1; i < scores.length; i++) {
if (scores[i] < min)
{
min = scores[i];
System.out.println(+ min);
}
}
for (int i = 1; i < scores.length; i++) {
if (scores[i] > max)
{
max = scores[i];
System.out.println(+ max);
}
}
答案 0 :(得分:1)
这似乎是正确的。
由于您已经以非常高的价值开始,因此在整个阵列中只有一个值高于 it 。因此,您只能看到代码一次输入def import_midifiles():
BASE_URL = 'http://www.tadpoletunes.com/tunes/celtic1/'
r = requests.get(BASE_URL)
soup = BeautifulSoup(r.text, 'lxml')
midi_list = []
reels_tr = soup.find('a', {'name': 'reels'}).find_parent('tr')
for tr in reels_tr.find_next_siblings('tr'):
if tr.find('a').text == 'SLIDES':
break
midi_list.append(BASE_URL + tr.find('a')['href'])
return midi_list
print(import_midifiles())
块并且只打印一次。
因为您已经以非常高的值开始,所以几个值低于整个数组中的 it 。因此,您可以看到print语句的次数与较低的数字相同 - 在本例中为4。
如果有多个值超过100,您会看到更多值从if
查找循环中打印出来。
如果您不想在完成之前看到这些值,那么就不要在循环中打印任何内容;打印各自循环的外值。
答案 1 :(得分:1)
正确的代码如下所示:
for (int i = 1; i < scores.length; i++) {
if (scores[i] < min)
{
min = scores[i];
System.out.println(+ min);
}
}
for (int i = 1; i < scores.length; i++) {
if (scores[i] > max)
{
max = scores[i];
}
}
System.out.println(min);
System.out.println(max);
如您所见,我将print语句移到了for循环之外。因为如果它们在循环内部会被执行多次,这就是代码中发生的事情。为什么max
只能打印一次呢?这只是一个巧合。由于输入数组中只有一个数字大于第一个元素99,因此if语句只运行一次。
此外,您的两个循环可以合并:
for (int i = 1; i < scores.length; i++) {
if (scores[i] < min)
{
min = scores[i];
}
if (scores[i] > max)
{
max = scores[i];
}
}
System.out.println(min);
System.out.println(max);
答案 2 :(得分:0)
由于您在for循环中包含了标准输出语句,因此它将打印所有新的最小/最大值。您需要等到比较数组中的所有值并在for
循环后打印最终的最小值/最大值。
做这样的事情。
public static void main(String[] args) {
int[] scores = {99, 95, 87, 100, 94, 85, 78, 84, 97, 91};
int min = scores[0];
int max = scores[0];
for (int i = 1; i < scores.length; i++) {
if (scores[i] < min)
{
min = scores[i];
}
}
System.out.println(min);
for (int i = 1; i < scores.length; i++) {
if (scores[i] > max)
{
max = scores[i];
}
}
System.out.println(max);
答案 3 :(得分:0)
以防这是一个真正的项目而不是家庭作业,我建议将最小和最大代码分解为单独的方法,并使用新的Java 8 Streams方法让JDK完成逻辑实现的工作
public static void main(String[] args) {
int[] scores = {99, 95, 87, 100, 94, 85, 78, 84, 97, 91};
System.out.println("Min is: "+minIntValueFromArray(scores));
System.out.println("Max is: "+maxIntValueFromArray(scores));
}
public static int minIntValueFromArray(int[] array) {
if (array.length == 0) {
throw new IllegalArgumentException("Array must not be empty.");
}
return Arrays.stream(array).min().getAsInt();
}
public static int maxIntValueFromArray(int[] array) {
if (array.length == 0) {
throw new IllegalArgumentException("Array must not be empty.");
}
return Arrays.stream(array).max().getAsInt();
}
Arrays.stream(int[])
方法(Java 8的一部分)使用它在原始IntStream
数组中找到的数字创建int
。 (建议您在使用Stream<Integer>
时不要创建IntStream
。){8} Streams API提供min()
和max()
方法,所以你不必担心为这些函数编写代码。
请注意,max()
和min()
会返回OptionalInt
,因为有时可能会遇到空数组,因此流必须返回一个可选类型。这里调用getAsInt()
是安全的,因为我们已经检查过以确保数组不为空。如果数组为空,则抛出异常,但是您选择如何处理空数组的情况取决于您。如果你想在一个空数组的情况下返回一个特定的int
值,那么你可以用这样的方法替换该方法:
private static final int ARRAY_MIN_EMPTY_DEFAULT = 0;
public static int minIntValueFromArray(int[] array) {
return Arrays.stream(array).min().orElse(ARRAY_MIN_EMPTY_DEFAULT);
}
请注意,很多人仍然对Java 8 Streams持谨慎态度,因为基准测试声称其性能低于使用旧的迭代方法(例如现有代码)。除非您的代码将用于应用程序的性能关键部分,否则您应该没问题。 (如果性能至关重要,您应该进行分析和基准测试,以确定需要优化的内容。)
答案 4 :(得分:-1)
只需在for循环外打印最小值和最大值。