1D счетчик частоты для других методов

63
7

Я хотел вызвать метод, который побуждал бы пользователя вводить мили, используемые галлонами, вычислять мили за галлон, отображать, сколько миль на галлон этого типа автомобиля попало в эту поездку. Я также хотел, чтобы этот метод передал обратно "1", чтобы позже добавить к частотомеру для каждого типа автомобилей. (Если автомобиль Honda, добавьте "1" в arrayname [1], если автомобиль Toyota, добавьте "1" в arrayname [2] и т.д.).

     int[] mpgList = new int[5]; // 5 because there are 4 more car types
mpgList[0] =

do{
prompt = Double.parseDouble(JOptionPane.showInputDialog(null, "Enter"
+ "\n"
+ "1 For Honda"));

if (prompt == 1)
{
forHonda();

};

......

 public static void forHonda(){
double miles, gallons, mpg;

miles = Double.parseDouble(JOptionPane.showInputDialog(null,"Enter Miles Driven "));
if (miles <= -1){
JOptionPane.showMessageDialog(null,"Input Is Negative"
+ "\n"
+ "Try Again");
miles = Double.parseDouble(JOptionPane.showInputDialog(null,"Enter Miles Driven "));
}
gallons = Double.parseDouble(JOptionPane.showInputDialog(null,"Enter Gallons Used "));
if (gallons <= -1){
JOptionPane.showMessageDialog(null,"Input Is Negative"
+ "\n"
+ "Try Again");
gallons = Double.parseDouble(JOptionPane.showInputDialog(null,"Enter Gallons Used "));
}
mpg = (miles/gallons);
if (gallons == 0){
JOptionPane.showMessageDialog(null, "Division by Zero"
+ "\n"
+ "Try Again");
miles = Double.parseDouble(JOptionPane.showInputDialog(null,"Enter Miles Driven "));
gallons = Double.parseDouble(JOptionPane.showInputDialog(null,"Enter Gallons Used "));
mpg = (miles/gallons);
}
JOptionPane.showMessageDialog(null,String.format("MPG for HONDA: %.0f"
+ "\n", mpg));

......

    public static void counter(int x[]){
for(int counter = 0; counter< x.length; counter++)
x[counter]+=1;
}

это была идея, к которой я стремился, но я застрял в том, как использовать массив для счетчика частоты

спросил(а) 2021-01-25T19:52:33+03:00 4 месяца, 4 недели назад
1
Решение
90

Я не уверен, почему вы хотите использовать только массивы и примитивные типы данных, но пусть это не является требованием (вы все-таки пишете Java-код). Вот как я пойду для решения проблемы отслеживания потребления топлива для нескольких типов автомобилей.

Таким образом, у нас есть предопределенный список типов автомобилей, которые необходимо отобразить и каким-то образом получить доступ к некоторому целому числу. Поэтому позвольте создать Enum для этого:

public enum CarType {

HONDA(1, "Honda"),
TOYOTA(2, "Toyota"),
ALFA(3, "Alfa Romeo")
// ...
;

private int id = 0;
private String displayName;

public static CarType forId(int id) {
for (CarType type : CarType.values()) {
if (type.id == id) {
return type;
}
}
throw new IllegalArgumentException("No car type with number " + id);
}

private CarType(int id, String displayName) {
this.id = id;
this.displayName = displayName;
}

public String getDisplayName() {
return displayName;
}

public int getId() {
return id;
}

}

Вы хотите отслеживать расход топлива, возможно общее количество миль, общее пройденное расстояние, количество поездок и MPG:

public class Consumption {

private double miles = 0;
private double gallons = 0;
private double mpg = 0;
private int numberOfTrips = 0;

public void addTrip(double miles, double gallons) throws IllegalArgumentException {
if (miles > 0 && gallons > 0) {
this.miles += miles;
this.gallons += gallons;
numberOfTrips++;
mpg = this.miles / this.gallons;
} else {
throw new IllegalArgumentException("Both miles and gallons have to be greater than zero");
}
}

public double getMiles() {
return miles;
}

public double getGallons() {
return gallons;
}

public double getMpg() {
return mpg;
}

public int getNumberOfTrips() {
return numberOfTrips;
}

}

Вам не нужно объявлять, что вы бросаете RuntimeException IllegalArgumentException поскольку это RuntimeException, но приятно, чтобы вызывающий пользователь знал, что это может произойти, и вы можете добавить блок Javadoc для описания, при каких обстоятельствах он это делает.

Вы хотите иметь возможность отслеживать расход топлива для нескольких типов транспортных средств:

import java.util.HashMap;

public class ConsumptionManager {
private HashMap<CarType, Consumption> data = new HashMap<>();

public Consumption addTripData(CarType type, double miles, double gallons) throws IllegalArgumentException {
if (type == null) {
throw new IllegalArgumentException("Car type cannot be null");
}
Consumption consumption = data.get(type);
if (consumption == null) {
consumption = new Consumption();
data.put(type, consumption);
}
consumption.addTrip(miles, gallons);

return consumption;
}

public Consumption getConsumption(CarType type) throws IllegalArgumentException {
if (type == null) {
throw new IllegalArgumentException("Car type cannot be null");
}
return data.get(type);
}

}

Теперь вы можете динамически создавать свой пользовательский интерфейс с помощью CarType Enum с чем-то вроде этого:

    for (CarType type : CarType.values()) {
// build your UI, e.g. on the console something like:
System.out.println(String.format("%d) %s", type.getId(), type.getDisplayName()));
}

Затем после сбора идентификатора типа, миль и галлонов, используемых в поездке, вы добавляете его и, возможно, отображаете текущее состояние:

    // create instance of ConsumptionManager somewhere, possibly in your start-up code: 
// ConsumptionManager mgr=new ConsumptionManager();
try {
Consumption consumption=mgr.addTripData(CarType.forId(id), miles, gallons);
// display mpg/number of trips/etc, e.g. on the console
System.out.println(String.format("Average range after %d trips: %f", consumption.getNumberOfTrips(),consumption.getMpg()));
} catch (Exception e) {
// display error to the user, e.g. on the console
System.out.println(e.getMessage());
}

Все, что вам нужно сделать, чтобы добавить другой тип автомобиля, это добавить его в перечисление CarType, и все готово. У вас также нет магических чисел, таких как количество поддерживаемых типов, их идентификаторы и т.д. По всему вашему коду, но только в тех местах, которые нужно знать о них.

ответил(а) 2021-01-25T19:52:33+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема