我正在开始学习java的初学者项目。 该项目是添加,列表和删除人员。喜欢
键入1以添加人员 键入2列出所有人 键入3以删除一个人。
我正在使用ArrayList集合来处理这个项目。
第一个问题是使用收藏品是一个很好的方法吗? 如果是的话我将全局声明ArrayList,但在迭代它时,我可以看到它没有存储任何数据。
我的代码如下。
import java.util.*;
public class OperationClass implements OperationInterface {
String id;
String fname;
String lname;
ArrayList<String> Person=new ArrayList<String>();
public static void main(String args[]) {
new OperationClass().operation();
}
public static void operation() {
int a;
Scanner in = new Scanner(System.in);
System.out.println("Enter 1 for Adding new Record");
System.out.println("Enter 2 to see List of Records");
System.out.println("Enter 3 to Delete a record");
System.out.println("Enter 4 to Exit!!");
a = in.nextInt();
if (a == 1) {
new OperationClass().addPerson();
} if (a == 2) {
new OperationClass().listPerson();
} if (a == 3) {
new OperationClass().deletePerson();
} if (a == 4) {
System.out.println("Thanks for using the program");
}
}
/**
* adds a new Person and stores in the collection
*/
@Override
public void addPerson() {
Scanner in = new Scanner(System.in);
new OperationClass().operation();
System.out.println("Enter a the id");
id = in.next();
System.out.println("Enter a the First Name");
fname = in.next();
System.out.println("Enter a the Last Name");
lname = in.next();
Person.add(id);
Person.add(fname);
Person.add(lname);
new OperationClass().operation();
}
@Override
public void listPerson() {
Iterator itr=Person.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
new OperationClass().operation();
}
@Override
public void deletePerson() {
System.out.println("Delete under construction");
}
@Override
public void quit() {
}
}
第一个输出是
输入1以添加新记录。
输入2以查看记录列表。
输入3以删除记录。
输入4退出!!
输入1就像这样
输入1以添加新记录
输入2以查看记录列表
输入3以删除记录
输入4退出!!
1
输入ID
1
输入名字
Indranil
输入姓氏
Sinha
然后再次点击进入后,前四个选项即将到来,而在进入2后它没有显示任何内容。
输入1以添加新记录
输入2以查看记录列表
输入3以删除记录
输入4退出!!
1
输入ID
1
输入名字
asdasd
输入姓氏
dsffdgdfg
输入1以添加新记录
输入2以查看记录列表
输入3以删除记录
输入4退出!!
2
输入1以添加新记录
输入2以查看记录列表
输入3以删除记录
输入4退出!!
答案 0 :(得分:3)
每次输入数字时,您都在创建一个新的OperationClass
对象:
if (a == 1) {
new OperationClass().addPerson(); //Creating a new object
} if (a == 2) {
new OperationClass().listPerson(); //Creating a new object
} if (a == 3) {
new OperationClass().deletePerson(); //Creating a new object
} if (a == 4) {
System.out.println("Thanks for using the program");
}
尝试调用已有对象的方法:
if (a == 1) {
addPerson();
} if (a == 2) {
listPerson();
} if (a == 3) {
deletePerson();
} if (a == 4) {
System.out.println("Thanks for using the program");
}
这将调用您在main()
。
正如所指出的,由于你的operation()
方法是静态的,所以这不会有用。我建议要么使这个方法非静态(因此是一个实例方法):
public void operation() {
//Your operation() code
}
或将operation()
代码全部移动到OperationClass
的构造函数,以便在创建该类的对象时正确运行代码:
public OperationClass() {
//Your operation() code
}
答案 1 :(得分:2)
你几乎到处都有new OperationClass().operation()/add/list...;
,你应该知道,当你new ...
创建一个新实例时,会有一个空的ArrayList<String> Person
列表。
您可能希望使用相同的实例,而不是每次都创建一个新实例。
答案 2 :(得分:2)
这里是为您工作和修改的代码:
import java.util.*;
public class OperationClass implements OperationInterface {
String id;
String fname;
String lname;
static ArrayList<String> Person=new ArrayList<String>();
public static void main(String args[]) {
new OperationClass().operation();
}
public static void operation() {
int a;
Scanner in = new Scanner(System.in);
System.out.println("Enter 1 for Adding new Record");
System.out.println("Enter 2 to see List of Records");
System.out.println("Enter 3 to Delete a record");
System.out.println("Enter 4 to Exit!!");
a = in.nextInt();
if (a == 1) {
new OperationClass().addPerson();
} if (a == 2) {
new OperationClass().listPerson();
} if (a == 3) {
new OperationClass().deletePerson();
} if (a == 4) {
System.out.println("Thanks for using the program");
}
}
/**
* adds a new Person and stores in the collection
*/
@Override
public void addPerson() {
Scanner in = new Scanner(System.in);
System.out.println("Enter a the id");
id = in.next();
System.out.println("Enter a the First Name");
fname = in.next();
System.out.println("Enter a the Last Name");
lname = in.next();
Person.add(id);
Person.add(fname);
Person.add(lname);
new OperationClass().operation();
}
@Override
public void listPerson() {
Iterator itr=Person.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
new OperationClass().operation();
}
@Override
public void deletePerson() {
System.out.println("Delete under construction");
}
@Override
public void quit() {
}
}
答案 3 :(得分:1)
您已将ArrayList
声明为instance variable
。
简单来说,它意味着a new object a new ArrayList will be cretaed
。
现在,在调用您正在执行的方法时,new OperationClass().addPerson();
在所有这些陈述中new OperationClass();
创建一个新对象,从而创建一个新的ArrayList
。
因此,在最后一个列表中没有任何内容。
我建议如下:
public static void operation()
方法是静态的,因此您无需创建对象来调用它。您可以通过类名直接调用它。因此,new OperationClass().operation();
可以替换为OperationClass.operation();
。但是它无法解决您的问题。
您需要做的是拥有OperationClass
的一个共同对象并将其存储在某个引用变量中然后使用此对象来调用其他方法,即不要调用new OperationClass()
一次又一次。
可以使用相同代码的替代方案将声明您的ArrayList
是静态的,static ArrayList<String> Person=new ArrayList<String>();
。
通过这样做,所有对象都会很常见,您将向单个公共ArrayList
添加数据。