对于学校中的项目,我们需要生成数据列表以及删除数据的可能性。我的项目包含以下类别:
主要方法» 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类中使用该数组。
还有第二个问题:我使用随机的名字和姓氏来生成电子邮件地址,但这些地址也是随机的。它们应与名字和姓氏相同。有什么想法可以解决这个问题吗?
更新了问题
答案 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 ...
相反!
换句话说:一个类创建,并将其返回给您的“主”类。然后,要“删除”该数组,可以将该数组的引用传递给“删除”类。
另一种方法可能是:
最后:另一个设计问题。您为UserName和UserMail建模(很好)。但是,然后您使用“原始”数组将它们组合在一起。那没有道理。您应该创建另一个类,该类包含一个UserName和一个UserMail实例。然后有一个NamedUserWithMail对象的一维数组!
答案 1 :(得分:0)
Menu
类应该对生成的数组具有本地引用,只要该类在内存中处于活动状态(即用户仍在与控制台外壳进行交互)。 GenerateData
类应将生成的数组返回给Menu
,然后可以将此局部变量传递给其他方法。