首页 > 解决方案 > 在另一个类中使用数组并停止随机数据

问题描述

对于学校的项目,我们需要生成数据列表以及删除数据的可能性。我的项目包含以下类:

主要方法 » ShowData.java

public class ShowData {
    public static void main(String[] args) {
        // Show the menu
        Menu menu = new Menu();
        menu.Menu();
    }
}

与数据的接口 » DataInterface.java

public interface DataInterface {
    // User firstname
    public final static String[] FIRSTNAME = new String[]{"Homer", "Otto", "Marge", "Lisa", "Maggie", "Patty", "Selma", "Ned", "Nelson", "Ralph"};    
    // User lastname
    public final static String[] LASTNAME = new String[]{"Simpson", "Flanders", "Bouvier", "Muntz", "Wiggum", "Burns", "Smithers", "Carlson", "Prince", "Mann"};
}

在生成、删除和退出之间选择的“菜单” » Menu.java

public class Menu {
    public void Menu() {
        boolean check = true;
        while(check) {                
            // Ask questions and read the answers
            System.out.println("Type 1 to generate names");
            System.out.println("Type 2 to delete generated names");
            System.out.println("Type 3 to exit program.\n");            
            Scanner userInput = new Scanner(System.in);
            String input = userInput.nextLine();                
            // Load the classes or exit program
            switch(input) {
                case "1":
                    GenerateData genData = new GenerateData();
                    genData.GenData();
                    break;
                case "2":
                    DeleteData delData = new DeleteData();
                    delData.DelData();
                    break;
                case "3":
                    check = false;
                    break;
                default:
                    System.out.println("\nWrong input!\n");
            }                    
        }
        System.out.println("Program closed.");
    }    
}

生成列表(数组)的类 » GenerateData.java

public String[][] generateData() {

    UserName username = new UserName();
    UserMail usermail = new UserMail();

    System.out.print("\nHow many names do you need?\n");

    Scanner scanner = new Scanner(System.in);
    int userCount = scanner.nextInt();

    System.out.println("");

    // Create array
    String[][] userArray = new String[userCount][2];

    // Fill array
    for (int i = 0; i < userCount; i++) {
        userArray[i][0] = username.userName();
        userArray[i][1] = usermail.userMail();
    }

    // Print array
    for (String[] a : userArray) {
        for (String a1 : a) {
            System.out.println(a1);
        }
        System.out.println("--------------------------------");
    }
    System.out.println("\n");

    return userArray;
}

获取名称的类 » UserName.java

public class UserName implements DataInterface {        
    // Generate Firstname
    public String firstName() {
        Random randFirst = new Random();
        return FIRSTNAME[randFirst.nextInt(FIRSTNAME.length)];
    }

    // Updated
    public String fixedFirst() { 
        final String fixedFirst = firstName(); 
        return fixedFirst; 
    }

    // Generate Lastname
    public String lastName() {
        Random randLast = new Random();
        return LASTNAME[randLast.nextInt(LASTNAME.length)];
    }

    // Updated
    public String fixedLast() { 
        final String fixedLast = lastName(); 
        return fixedLast; 
    }

    // Build Username
    public String userName() {
        return firstName() + " " + lastName();
    }        
}

构建电子邮件地址的类 » UserMail.java

public class UserMail extends UserName {        
    // Firstname and lastname from UserName class
    public String mailFirst() {
        return fixedFirst();
    }        
    public String mailLast() {
        return fixedLast();
    }        
    // Build mail address
    public String userMail() {
        return firstName().toLowerCase() + "." + lastName().toLowerCase() + "@springfieldmail.com";
    }        
}

最后是要在数组中删除的类。»删除数据.java

public class DeleteData {
    public void DelData() {            
        // Get array
        // If array is empty tell inform the user
        // If array isn't empty:    
        System.out.println("Which line do you want to delete?");
        Scanner scanner = new Scanner(System.in);
        int line = scanner.nextInt();
        if (line > array.length) {
            System.out.println("Wrong input");
        } else {
            System.out.println("Line " + line + " has been deleted.");
        }
    }
}

我省略了包和导入的行。已经有很多文字了。

如您所见,我没有在 DeleteData 类中使用该数组,因为我不知道如何访问该数组。

还有第二个问题:我使用随机的名字和姓氏来生成电子邮件地址,但地址也是随机的。它们应该与名字和姓氏相同。任何想法如何解决这个问题?

更新了问题

标签: java

解决方案


这里:

public String firstName() {
    Random randFirst = new Random();
    return FIRSTNAME[randFirst.nextInt(FIRSTNAME.length)];
}      

每次在 UserName 类中运行一个方法时,该方法都会返回一个的随机值。这是一个非常糟糕的主意,可能会影响代码中的所有内容。

当你创建一个new UserName()时,一旦这个对象应该选择随机值,但从那里开始,对于那个对象,这些初始值应该保持不变。

因此,您必须为该类提供两个(最终)字段,并且在创建时设置这两个字段一次,然后您的方法变成简单的 getter。

对于另一个问题:您的生成类创建新数组。然后“忘记”他们。所以,public void GenData()你应该有一个方法,而不是一个方法:

public String[][] generateUserData() {
... return ...

反而!

换句话说:一个类创建一个数组对象,并将其返回给您的“主”类。然后,要“删除”该数组,您可以将该数组的引用传递给“删除”类。

另一种方法可能是:

  • "main" 为您创建空数组
  • 它将该数组传递给另一个类进行填充
  • 它将该数组传递给另一个类以“删除”条目

最后:另一个设计问题。您为 UserName 和 UserMail 建模(这很好)。但是随后您使用“原始”数组将它们组合在一起。那没有意义。您应该创建另一个包含 UserName 和 UserMail 实例的类。然后有一个由 NamedUserWithMail 对象组成的单色数组!


推荐阅读