我非常接近完成此操作,我需要的是通过使用数组从文本文件中找到五个最低值的帮助。我想出了如何找到五个最高值,但我找到最低值的min数组总是输出五个0' s。
输出://显然依赖于单个文本文件
文本文件中的总数量为10
总和是:1832
1775 14 9 9 7 //最大
0 0 0 0 0 // min
非常感谢任何帮助!
import java.util.Scanner;
import java.io.*;
public class HW3
{
public static void main(String[] args) throws IOException
{
File f = new File("integers.txt");
Scanner fr = new Scanner(f);
int sum = 0;
int count = 0;
int[] max = new int[5];
int[] min = new int[5];
int temp;
while(fr.hasNextInt())
{
count++;
fr.nextInt();
}
Scanner fr2 = new Scanner(new File("integers.txt"));
int numbers[] = new int[count];
for(int i=0;i<count;i++)
{
numbers[i]=fr2.nextInt(); //fills array with the integers
}
for(int j:numbers)//get sum
{
sum+=j;
}
for (int j=0; j < 5; j++) //finds five highest
{
for (int i=0; i < numbers.length; i++)
{
if (numbers[i] > max[j])
{
temp = numbers[i];
numbers[i] = max[j];
max[j] = temp;
}
}
}
for (int j=0; j < 5; j++) //finds five lowest...array not assigned values
{
for (int i=0; i < numbers.length; i++)
{
if (numbers[i] < min[j])
{
temp = numbers[i];
numbers[i] = min[j];
min[j] = temp;
}
}
}
System.out.println("Total amount of numbers in text file is " + count);
System.out.println("Sum is: " + sum);
System.out.println(max[0] + " " + max[1] + " " + max[2] + " " + max[3] + " " + max[4]);
System.out.println(min[0] + " " + min[1] + " " + min[2] + " " + min[3] + " " + min[4]);
}
}
答案 0 :(得分:2)
您的min数组将初始化为零值。所以数字中的值总是更高(假设没有负数)。
我建议您在内循环之前使用数字[0]初始化min [j]。
for (int j=0; j < 5; j++) //finds five highest
{
min[j] = numbers[0]; // Add this line
for (int i=0; i < numbers.length; i++)
{
答案 1 :(得分:1)
尝试通过在嵌套的min循环中输入以下行来调试代码:
System.out.println("the value of numbers[i] is: " + numbers[i]);
所以它看起来像这样:
for (int j=0; j < 5; j++) //finds five lowest...array not assigned values
{
for (int i=0; i < numbers.length; i++)
{
if (numbers[i] < min[j])
{
System.out.println("the value of numbers[i] is: " + numbers[i]);
temp = numbers[i];
numbers[i] = min[j];
min[j] = temp;
}
}
}
你会发现一些有趣的东西。最里面的嵌套部分甚至没有启动。
尝试将该行放入其各自位置的嵌套最大循环中......并且它将正常运行并显示最大数组值。你得到min数组的零值,因为(除了初始赋值)嵌套的min循环的最里面的部分没有以某种方式启动,所以它无法运行,并且搜索的值不会被分配给min数组。
如果您尝试使用类似的行调试它们,则min循环的外部嵌套部分可以正常运行。这部分不会开始,而且出现了问题:
if (numbers[i] < min[j])
{
System.out.println("the value of numbers[i] is: " + numbers[i]);
temp = numbers[i];
numbers[i] = min[j];
min[j] = temp;
}
(更新) 在min循环中,完成最大循环后,i = 0到i = 4的数字[i]的值为0.
你只需要添加一行并在你的min循环中使用int i = 5而不是int i = 0:
for (int j=0; j < 5; j++) //finds five lowest...array not assigned values
{
min[j] = max[4]; // added line
for (int i=5; i < numbers.length; i++) // change to int i=5
{
if (numbers[i] < min[j])
{...
答案 2 :(得分:0)
只是好奇,你不能对它进行排序(使用快速排序)选择前五和后五吗? - 如果你可以使用排序我认为这应该工作
int sum = 0;
int count = 0;
int[] max = {Integer.MIN_VALUE,Integer.MIN_VALUE,Integer.MIN_VALUE,Integer.MIN_VALUE,Integer.MIN_VALUE};
int[] min = {Integer.MAX_VALUE,Integer.MAX_VALUE,Integer.MAX_VALUE,Integer.MAX_VALUE,Integer.MAX_VALUE};
int temp;
int visited[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
for (int j : numbers)// get sum
{
sum += j;
}
int tempindex;
for (int j = 0; j < 5; j++) // finds five highest
{
for (int i = 0; i < numbers.length; i++) {
if (visited[i] != 1) {
if (numbers[i] > max[j]) {
max[j] = numbers[i];
tempindex = i;
}
}
}
visited[tempindex] = 1;
}
for (int j = 0; j < 5; j++) // finds five lowest...array not assigned
// values
{
for (int i = 0; i < numbers.length; i++) {
if (visited[i] != 1) {
if (numbers[i] < min[j]) {
min[j] = numbers[i];
tempindex = i;
}
}
}
visited[tempindex] = 1;
}
答案 3 :(得分:0)
正如另一个答案所述,您的问题是您没有考虑从0开始的数组。在Java中,它为该数据结构设置默认值。对于基元,通常为0或false。但是,当您进入数据结构时,如果无法初始化对象,则会出现空指针异常问题。出于这个原因,我建议你养成在使用它们之前在数据结构中设置值的习惯。这将为您节省大量的调试时间。
如果您事先知道这些值,可以使用{0,0,0,0,0}表示法手动设置它们,或者使用for循环初始化它们:
for(int i = 0; i < array.length; i++)
array[i] = init_value;
我建议您考虑尽可能地进行整合。例如,在您的代码中,您将浏览相同的数据4次:
1)将文件中的整数读入整数数组
2)求和整数数组中的所有数字
3)寻找最大
4)寻找分钟
我不确定你是否已经涵盖了功能,但是合并这个功能的一个例子可能如下:
while(fr2.hasNextInt()){
int i = fr2.nextInt();
sum += i;
checkHighest(i);
checkLowest(i);
}
然后定义这些功能并将肉放在别处。这让你只需要在一个地方担心循环。
答案 4 :(得分:0)
你有两个问题。 汤姆·艾略特(Tom Elliott)解释了第一个问题。
第二个问题是max []数组也初始化为0,当你搜索最大值时,你用数字数组中的值更改max array(即0)的值,所以数字数组变得充满了0。
快速解决(尽管不是最好的)是将数字数组复制到临时数组中,并在搜索最小值时使用该数据。
如果您没有完全理解我所说的内容,请在找到5个最大值后尝试打印数字数组。