Игнорирование отрицательных значений от Java Arraylist для расчетов - PullRequest
1 голос
/ 11 января 2020

Идея моего кода состоит в том, что он запрашивает у пользователя доход за каждый месяц, пока пользователь не введет отрицательное значение, которое не должно добавляться к общему доходу и которое должно отображаться в выходных данных, но игнорироваться в расчетах. Затем код вычисляет общий доход (игнорируя последнее отрицательное значение), средний доход (игнорируя отрицательное значение) и наибольшее / максимальное значение всех значений. У меня нет проблем с получением этого максимального значения. Но как я мог игнорировать отрицательный доход в расчетах, а может даже вообще не добавлять его в массив?

Проблема состоит в том, что расчет добавляет также отрицательное значение / доход к общей сумме и среднему доходу расчеты. И это не игнорирует месяц отрицательного дохода.

Вот мой код до сих пор:

package income;

import java.util.Scanner;
import java.util.ArrayList;
import java.util.Collections;

public class Income {

    public static void main(String[] args) {
        int sum = 0;
        int months = 0;
        Scanner input = new Scanner(System.in);
        System.out.println("Write the income of each month.");

         ArrayList<Integer> array = new ArrayList<Integer>();
         System.out.println("Write the income of month 1: ");
            int income = input.nextInt();
            sum += income;
            months++;
            array.add(income);

        while(true){
            months++;
            System.out.println("Write " + months + ". month income: ");
            if(income >= 0){
            income = input.nextInt();
            sum += income;

            array.add(income);

            }
            else if (income < 0){
                break;
            }
        }

        /*This did not work
          for(int i= 0; i < array.size(); i++){
              if(income < 0){
                  array.remove(i);
              }
          }*/
        months--;

        System.out.println("The total income is " + sum);
        System.out.println("The average income is " + sum/months);

        //This one below works fine
        System.out.println("The biggest income is " + Collections.max(array));
        } 
    }

Ответы [ 3 ]

2 голосов
/ 11 января 2020

Хотя вы действительно добавляете последнее отрицательное число в расчеты, это не является основной причиной, по которой ваш код не работает. Вы на самом деле проверяете, больше ли прочитанный вами ввод предыдущий больше 0:

while(true){
    months++;
    System.out.println("Write " + months + ". month income: ");
    if(income >= 0){ <------
    income = input.nextInt();

То есть l oop остановится, только если предыдущий ввод меньше 0. Другими словами, когда вы вводите, например, -1 in, ввод не проверяется до следующей итерации l oop, когда точка -1 уже добавлена ​​в массив. Поэтому вместо этого следует проверить income >= 0 сразу после nextInt:

System.out.println("Write the income of each month.");
ArrayList<Integer> array = new ArrayList<>();
while(true){
    months++;
    System.out.println("Write the income for month" + months + ":");
    int income = input.nextInt();
    if(income >= 0){
        sum += income;

        array.add(income);

    }
    else {
        break;
    }
}

Обратите внимание, что я также удалил бит между Write the income of each month. и while l oop, поскольку это избыточно.

0 голосов
/ 11 января 2020

Вы можете использовать функцию Integer.signum (int) , чтобы узнать, является ли значение отрицательным (возвращаемое значение = -1) или нулевым (возвращаемое значение = 0) или положительным (возвращаемое значение = 1) , Итак, в основном игнорируем if Integer.signum(income) == -1

0 голосов
/ 11 января 2020

Полагаю, это то, что вы ищете.

    var list = new ArrayList<Integer>();
    var in = new Scanner(System.in);
    var i = 0;

    System.out.println("Write Income of Each Month.");

    while (true)
    {
        System.out.print("Write " + ++i + ".month income : " );
        int num = in.nextInt();

        if (num < 0)
        {
            int sum = list.stream().mapToInt(Integer::intValue).sum();
            double avg = (double) sum / --i;
            int max = Collections.max(list);

            System.out.printf("Sum : %d\nAverage : %f\nBiggest Number : %d\nNegative No. %d", sum ,avg, max, num);
            break;
        }
        else
        {
            list.add(num);
        }
    }
...