Как получить пользовательский ввод и сохранить в пользовательском объекте? JAVA - PullRequest
1 голос
/ 14 апреля 2020

Привет, В основном, что я пытаюсь сделать, это получить пользовательский ввод и сохранить в пользовательском объекте, но я понятия не имею, как go об этом. Я создал метод loadDataFromConfig () ? , который отлично работает при создании объекта SmartHome app = new SmartHome(loadDataFromConfig());. Но я полностью озадачен тем, как получать пользовательские входные данные и сохранять их в следующем формате: dev[0] = new SmartDevice("device 1",1.3,true);.

Весь код, предназначенный для запуска, должен находиться внутри метода main в Step1.java

*. 1009 * Вот 3 класса, используемые для кода (игнорируйте комментарии, они для меня просто примечания):
package SmartHomeApp;

public class SmartDevice {
    private String name;
    private double location;
    private boolean switchedOn;

    public SmartDevice(String val1, double val2, boolean val3) {
        setName(val1);
        setLocation(val2);
        setSwitchedOn(val3);
    }

    //YOU CANT ACCESS the 'private classes' so you need to GET them
    public void setName(String value) {name = value;}
    public void setLocation(double value) {location = value;}
    public void setSwitchedOn(boolean value) {switchedOn = value;}

    public String getName() {return name;}
    public double getLocation() {return location;}
    public boolean getSwitchedOn() {return switchedOn;}
}
package SmartHomeApp;

public class SmartHome 
     {

    private SmartDevice[] smrtDev;

    public SmartHome(int size) {
        smrtDev = new SmartDevice[size];
    }

    public SmartHome(SmartDevice[] values) {
        smrtDev = values;
    }

    public int size() {return smrtDev.length;}

    // can't do toString() for some reason??
    public void ToString() {

            for(int i=0; i<size();i++) 
            {
                if(smrtDev[i] != null ){ 
                System.out.println("----------");
                System.out.println("-DEVICE "+(i+1)+"-");
                System.out.println("----------");
                System.out.println("Name:            "+smrtDev[i].getName());
                System.out.println("Location:        "+smrtDev[i].getLocation());
                System.out.println("Switched On:     "+smrtDev[i].getSwitchedOn());

            }
        }
    }
     }
package SmartHomeApp;
import java.util.*;


public class Step1 {

    public static void main(String args[]) {
        SmartHome app = new SmartHome(loadDataFromConfig());
        app.ToString();

    }
    public static SmartDevice[] loadDataFromConfig() 
    {
        SmartDevice[] dev = new SmartDevice[20];

        dev[0] = new SmartDevice("device 1",1.3,true);
        dev[1] = new SmartDevice("device 2",2.3,false);
        dev[2] = new SmartDevice("device 3",3.3,true);
        dev[4] = new SmartDevice("device 5",4.3,false);
        dev[19] = new SmartDevice("device 20",5.3,false);


        return dev;
    }

}

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Некоторые улучшения вашего кода следующие:

  1. Следуйте Java соглашениям об именах например ToString() должно быть toString(). Отметьте this , чтобы узнать больше о toString(). Большинство IDE (например, eclipse) предоставляют возможность генерировать метод toString() по нажатию кнопки. Независимо от того, каким образом (вручную или с помощью вашей IDE) вы его сгенерируете, он должен вернуть String.
  2. . Вам следует покончить с использованием next(), nextInt(), nextDouble() et c. и используйте nextLine() вместо этого. Отметьте this , чтобы узнать больше. Чтобы дать вам представление о том, что могут вызвать проблемы next(), nextDouble(), попробуйте ввести имя с пробелом, например
Enter size: 
2
Name: 
Light Amplification by Stimulated Emission of Radiation
Location: 
Exception in thread "main" java.util.InputMismatchException
    at java.base/java.util.Scanner.throwFor(Scanner.java:939)
    at java.base/java.util.Scanner.next(Scanner.java:1594)
    at java.base/java.util.Scanner.nextDouble(Scanner.java:2564)
    at Main.main(Main.java:83)

Ниже приведен пример кода, включающий упомянутые выше улучшения:

import java.util.Scanner;

class SmartDevice {
    private String name;
    private double location;
    private boolean switchedOn;

    public SmartDevice(String val1, double val2, boolean val3) {
        setName(val1);
        setLocation(val2);
        setSwitchedOn(val3);
    }

    // YOU CANT ACCESS the 'private classes' so you need to GET them
    public void setName(String value) {
        name = value;
    }

    public void setLocation(double value) {
        location = value;
    }

    public void setSwitchedOn(boolean value) {
        switchedOn = value;
    }

    public String getName() {
        return name;
    }

    public double getLocation() {
        return location;
    }

    public boolean getSwitchedOn() {
        return switchedOn;
    }

    @Override
    public String toString() {
        return "SmartDevice [name=" + name + ", location=" + location + ", switchedOn=" + switchedOn + "]";
    }
}

class SmartHome {

    private SmartDevice[] smrtDev;

    public SmartHome(int size) {
        smrtDev = new SmartDevice[size];
    }

    public SmartHome(SmartDevice[] values) {
        smrtDev = values;
    }

    public int size() {
        return smrtDev.length;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        for (SmartDevice smartDevice : smrtDev) {
            sb.append(smartDevice.toString()).append("\n");
        }
        return sb.toString();
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner myObj = new Scanner(System.in);
        int size = getPositiveInt(myObj, "Enter size: ");

        SmartDevice[] newList = new SmartDevice[size];

        for (int i = 0; i < newList.length; i++) {
            System.out.print("Name: ");
            String x = myObj.nextLine();
            double y = getFloatingPointNumber(myObj, "Location: ");
            boolean z = getBoolean(myObj, "Is on?: ");
            newList[i] = new SmartDevice(x, y, z);
        }
        SmartHome newDevice = new SmartHome(newList);
        System.out.println(newDevice);
    }

    static int getPositiveInt(Scanner in, String message) {
        boolean valid;
        int n = 0;
        do {
            valid = true;
            System.out.print(message);
            try {
                n = Integer.parseInt(in.nextLine());
                if (n <= 0) {
                    throw new IllegalArgumentException();
                }
            } catch (IllegalArgumentException e) {
                System.out.println("This in not a positive integer. Please try again.");
                valid = false;
            }
        } while (!valid);
        return n;
    }

    static double getFloatingPointNumber(Scanner in, String message) {
        boolean valid;
        double n = 0;
        do {
            valid = true;
            System.out.print(message);
            try {
                n = Double.parseDouble(in.nextLine());
            } catch (NumberFormatException | NullPointerException e) {
                System.out.println("This in not a number. Please try again.");
                valid = false;
            }
        } while (!valid);
        return n;
    }

    static boolean getBoolean(Scanner in, String message) {
        System.out.print(message);
        return Boolean.parseBoolean(in.nextLine());
    }
}

Пример прогона:

Enter size: x
This in not a positive integer. Please try again.
Enter size: -2
This in not a positive integer. Please try again.
Enter size: 10.5
This in not a positive integer. Please try again.
Enter size: 2
Name: Light Amplification by Stimulated Emission of Radiation
Location: 123.456
Is on?: true
Name: Vacuum Diode
Location: 234.567
Is on?: no
SmartDevice [name=Light Amplification by Stimulated Emission of Radiation, location=123.456, switchedOn=true]
SmartDevice [name=Vacuum Diode, location=234.567, switchedOn=false]
0 голосов
/ 14 апреля 2020

Итак, как я и предлагал, я попытался сделать следующее:

    public static void main(String args[]) {

    Scanner myObj = new Scanner(System.in);

    System.out.println("Enter size: ");
    int size = myObj.nextInt();

    SmartDevice[] newList = new SmartDevice[size];

    for(int i =0; i<newList.length;i++) {
        System.out.println("Name: ");
        String x = myObj.next();
            System.out.println("Location: ");
            double y = myObj.nextDouble();
                System.out.println("Is on?: ");
                boolean z = myObj.nextBoolean();
        newList[i] = new SmartDevice(x,y,z);            

    }
    SmartHome newDevice = new SmartHome(newList);   
    newDevice.ToString();

}

Работал, но не уверен, что это самый эффективный способ сделать это ??

...