在另一个类中使用数组并停止随机数据

时间:2019-01-15 14:10:21

标签: java

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

主要方法» 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";
    }        
}

最后是要在数组中删除的类。 » DeleteData.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类中使用该数组。

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

更新了问题

2 个答案:

答案 0 :(得分:1)

这里:

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

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

创建new UserName()时,一次该对象应选择随机值,但从那以后,该对象的这些初始值应保持固定。

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

对于另一个问题:您的生成类创建了新的数组。然后“忘记”他们。因此,您应该拥有:

,而不是使用public void GenData()方法
public String[][] generateUserData() {
... return ...

相反!

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

另一种方法可能是:

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

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

答案 1 :(得分:0)

Menu类应该对生成的数组具有本地引用,只要该类在内存中处于活动状态(即用户仍在与控制台外壳进行交互)。 GenerateData类应将生成的数组返回给Menu,然后可以将此局部变量传递给其他方法。