从阵列中挑选最重要且价值较低的一天时遇到麻烦

时间:2014-11-28 21:39:17

标签: java arrays

我有这段代码,7天的数组,用户输入哪一天以及每天有多少票。 循环将继续,直到该数字大于50(总票数)。 我想选择最想要的一天,而不是一个。 这是代码:

int ticketCounter=0;
final int MAX_TICKET=50;
int[] dayOfTicket=new int[7];
int mostWantedDay=dayOfTicket[0];
int LessWantedDay=dayOfTicket[0];
int indexOfWantedDay=0;
int indexOfLessWantedDay=0;
 while(ticketCounter<=MAX_TICKET){
    System.out.println("Enter the day number (1-7) and the number of tickets:");
    int whichDay=s.nextInt();
    int numberOfTicket=s.nextInt();

        if(whichDay>0 && whichDay<8){
        dayOfTicket[whichDay-1]+=numberOfTicket;
        ticketCounter+=numberOfTicket;
        }else{
        System.out.println("Invalid input.\n");
        }   
    }
}
    for(int f=0;f<dayOfTicket.length;f++){
        if(dayOfTicket[f]>mostWantedDay){
            indexOfWantedDay=f+1;
        }
        if(dayOfTicket[f]<LessWantedDay){
            indexOfLessWantedDay=f+1;
        }
System.out.printf("The day with max tickets is: %d \nThe day with min tickets is: %d \n\n",indexOfWantedDay, indexOfLessWantedDay);        

它在最想要的日子里选错了,并且总是打印0作为不太想要的日子。 我在最后一个for循环中遇到了这个检查方法的问题。 我会帮助你。 感谢

编辑:我在WHILE之外取出了for循环(这是我的复制粘贴错误)

3 个答案:

答案 0 :(得分:2)

您想要的日期总是打印0的原因是因为这很可能低于输入的输入。

另一种方法是将lessWantedDay值设置为INTEGER.MAX_VALUE,或者只设置最大票证值,或者另一个任意随机大数字,例如9001,100000,等等。

另一种替代方法(如果您不能使用上面提到的基本内容)是您可以在从用户获得输入后将LessWantedDay和mostWantedDay设置为数组的第一个元素。

    int mostWantedDay;
    int LessWantedDay;
    <snipped out input logic/>
    mostWantedDay = dayOfTicket[0];
    LessWantedDay = dayOfTicket[0];

每当您找到最多和最少的一天时,您需要使用找到的值更新mostWantedDay和LessWantedDay的值

所以你的if语句看起来像这样:

 if(dayOfTicket[f]>mostWantedDay){
        indexOfWantedDay=f+1;
        mostWantedDay = dayOfTicket[f];
    }
    if(dayOfTicket[f]<LessWantedDay){
        indexOfLessWantedDay=f+1;
        LessWantedDay = dayOfTicket[f];
    }

答案 1 :(得分:2)

部分问题是初始化LessWantedDay时,您最初将其设置为0。

使用

将此值初始化为最大值
int LessWantedDay=Integer.MAX_VALUE;

此外,您需要更新支票中的逻辑以过滤掉0(假设您要打印一张没有0票的日子),并将您的最大/最小值更新为你解析dayOfTicket数组。

for(int f=0;f<dayOfTicket.length;f++){
    if(dayOfTicket[f]>mostWantedDay){
        indexOfWantedDay=f+1;
        mostWantedDay = dayOfTicket[f];
    }
    if(dayOfTicket[f]<LessWantedDay && dayOfTicket[f] > 0){
        indexOfLessWantedDay=f+1;
        LessWantedDay = dayOfTicket[f]
    }
}

测试输出:

Enter the day number (1-7) and the number of tickets:
1 10
Enter the day number (1-7) and the number of tickets:
3 5
Enter the day number (1-7) and the number of tickets:
5 20
Enter the day number (1-7) and the number of tickets:
4 15
Enter the day number (1-7) and the number of tickets:
6 10
The day with max tickets is: 5 
The day with min tickets is: 3 

答案 2 :(得分:2)

这段代码几乎完全正确。

在你的循环中,你说:

for(int f=0;f<dayOfTicket.length;f++){
    if(dayOfTicket[f]>mostWantedDay){
        indexOfWantedDay=f+1;
    }
    if(dayOfTicket[f]<LessWantedDay){
        indexOfLessWantedDay=f+1;
    }
}

你不应该将索引设置为&#34; f + 1&#34;,这将是我们在循环中的位置之后的索引,我们想要实际的位置。

此外,这将覆盖最后一天的最高日期,该日期超过变量&#34; mostWantedDay&#34;并且相反,#34; lessWantedDay。您需要做的是在您找到高于当前最高票数或低于当前票价的票数之后将其设置为该值。

这样,在测试时,您可以测试最高或最低的测试。截至目前,您正在不断测试第一个索引的数字,因为它存储在大多数/ lessWantedDay中,并且永远不会更改。

更改后,您的代码将如下所示:

for(int f=0;f<dayOfTicket.length;f++){
    if(dayOfTicket[f]>mostWantedDay){
        indexOfWantedDay=f;
        mostWantedDay = dayOfTicket[f];
    }
    if(dayOfTicket[f]<LessWantedDay){
        indexOfLessWantedDay=f;
        LessWantedDay[f] = dayOfTicket[f];
    }
}