Java 添加方法链接列表
我已经创建了一个包含对象的链表。该对象称为Student,有三个参数:姓名、年龄、年级。这是我的课 链接Java 添加方法链接列表,java,object,linked-list,Java,Object,Linked List,我已经创建了一个包含对象的链表。该对象称为Student,有三个参数:姓名、年龄、年级。这是我的课 链接 class Link { public Object s; public Link next; public Link(Object Student) { s=Student; next=null; } } 学生 class Student { private static String name; priv
class Link {
public Object s;
public Link next;
public Link(Object Student) {
s=Student;
next=null;
}
}
学生
class Student {
private static String name;
private static int age;
private static int grade;
public Student (String n, int a, int g) {
setName(n);
setGrade(g);
setAge(a);
}
public static void setName(String n) {
name=n;
}
public static void setGrade(int g) {
grade=g;
}
public static void setAge(int a) {
age=a;
}
public int getAge() {
return age;
}
public int getGrade() {
return grade;
}
public static String getName() {
return name;
}
public String toString() {
return "Name: " +name+ " Age: " +age+ " Grade: " +grade;
}
}
import java.util.*;
class List {
private static LinkedList<Student> ll = new LinkedList<Student>();
private static Link first;
public List() {
first=null;
}
public static void addStudent() {
Scanner s = new Scanner(System.in);
System.out.println("What is the student's name;");
String n = s.nextLine();
System.out.println("What is the student's age;");
int b = s.nextInt();
System.out.println("What is the student's grade;");
int g = s.nextInt();
Student nStudent = new Student(n, b, g);
Link newStudent = new Link(nStudent);
newStudent.next=first;
first=newStudent;
ll.add(nStudent);
}
public static Link findStudent() {
Scanner sc = new Scanner(System.in);
System.out.println("What is the student's name?");
String n = sc.nextLine();
Link current = first;
String name = Student.getName();
while (name!= n) {
if (current.next==null)
return null;
else
current=current.next;
}
return current;
}
public static void change () {
Scanner sc = new Scanner(System.in);
Link h = findStudent();
System.out.println("If you want to change his name press 1;");
System.out.println("If you want to change his age press 2;");
System.out.println("If you want to change his grade press 3;");
int l = sc.nextInt();
if (l==1) {
System.out.println("What name do you want the student to have?");
String newname = sc.nextLine();
Student.setName(newname);
} else if (l==2) {
System.out.println("What age do you want the student to have?");
int j = sc.nextInt();
Student.setAge(j);
}
else if (l==3) {
System.out.println("What grade do you want the student to have?");
int e = sc.nextInt();
Student.setGrade(e);
}
}
public static void show() {
System.out.println(ll);
}
}
What do you want to do?
To add a student press 1
To change something press 2
To see your students press 3
1
What is the student's name;
Tom
What is the student's age;
16
What is the student's grade;
90
What do you want to do?
To add a student press 1
To change something press 2
To see your students press 3
1
What is the student's name;
Eric
What is the student's age;
16
What is the student's grade;
91
What do you want to do?
To add a student press 1
To change something press 2
To see your students press 3
3
[Name: Eric Age: 16 Grade: 91, Name: Eric Age: 16 Grade: 91]
What do you want to do?
To add a student press 1
To change something press 2
To see your students press 3
列表
class Student {
private static String name;
private static int age;
private static int grade;
public Student (String n, int a, int g) {
setName(n);
setGrade(g);
setAge(a);
}
public static void setName(String n) {
name=n;
}
public static void setGrade(int g) {
grade=g;
}
public static void setAge(int a) {
age=a;
}
public int getAge() {
return age;
}
public int getGrade() {
return grade;
}
public static String getName() {
return name;
}
public String toString() {
return "Name: " +name+ " Age: " +age+ " Grade: " +grade;
}
}
import java.util.*;
class List {
private static LinkedList<Student> ll = new LinkedList<Student>();
private static Link first;
public List() {
first=null;
}
public static void addStudent() {
Scanner s = new Scanner(System.in);
System.out.println("What is the student's name;");
String n = s.nextLine();
System.out.println("What is the student's age;");
int b = s.nextInt();
System.out.println("What is the student's grade;");
int g = s.nextInt();
Student nStudent = new Student(n, b, g);
Link newStudent = new Link(nStudent);
newStudent.next=first;
first=newStudent;
ll.add(nStudent);
}
public static Link findStudent() {
Scanner sc = new Scanner(System.in);
System.out.println("What is the student's name?");
String n = sc.nextLine();
Link current = first;
String name = Student.getName();
while (name!= n) {
if (current.next==null)
return null;
else
current=current.next;
}
return current;
}
public static void change () {
Scanner sc = new Scanner(System.in);
Link h = findStudent();
System.out.println("If you want to change his name press 1;");
System.out.println("If you want to change his age press 2;");
System.out.println("If you want to change his grade press 3;");
int l = sc.nextInt();
if (l==1) {
System.out.println("What name do you want the student to have?");
String newname = sc.nextLine();
Student.setName(newname);
} else if (l==2) {
System.out.println("What age do you want the student to have?");
int j = sc.nextInt();
Student.setAge(j);
}
else if (l==3) {
System.out.println("What grade do you want the student to have?");
int e = sc.nextInt();
Student.setGrade(e);
}
}
public static void show() {
System.out.println(ll);
}
}
What do you want to do?
To add a student press 1
To change something press 2
To see your students press 3
1
What is the student's name;
Tom
What is the student's age;
16
What is the student's grade;
90
What do you want to do?
To add a student press 1
To change something press 2
To see your students press 3
1
What is the student's name;
Eric
What is the student's age;
16
What is the student's grade;
91
What do you want to do?
To add a student press 1
To change something press 2
To see your students press 3
3
[Name: Eric Age: 16 Grade: 91, Name: Eric Age: 16 Grade: 91]
What do you want to do?
To add a student press 1
To change something press 2
To see your students press 3
您会注意到,在课程中,我多次编写相同的代码,但这是因为我无法找到一种方法,在执行命令后,我可以返回主菜单,并且列表的内容不会丢失。
显然,我的add方法是错误的,当我执行程序时,输出如下:
输出
class Student {
private static String name;
private static int age;
private static int grade;
public Student (String n, int a, int g) {
setName(n);
setGrade(g);
setAge(a);
}
public static void setName(String n) {
name=n;
}
public static void setGrade(int g) {
grade=g;
}
public static void setAge(int a) {
age=a;
}
public int getAge() {
return age;
}
public int getGrade() {
return grade;
}
public static String getName() {
return name;
}
public String toString() {
return "Name: " +name+ " Age: " +age+ " Grade: " +grade;
}
}
import java.util.*;
class List {
private static LinkedList<Student> ll = new LinkedList<Student>();
private static Link first;
public List() {
first=null;
}
public static void addStudent() {
Scanner s = new Scanner(System.in);
System.out.println("What is the student's name;");
String n = s.nextLine();
System.out.println("What is the student's age;");
int b = s.nextInt();
System.out.println("What is the student's grade;");
int g = s.nextInt();
Student nStudent = new Student(n, b, g);
Link newStudent = new Link(nStudent);
newStudent.next=first;
first=newStudent;
ll.add(nStudent);
}
public static Link findStudent() {
Scanner sc = new Scanner(System.in);
System.out.println("What is the student's name?");
String n = sc.nextLine();
Link current = first;
String name = Student.getName();
while (name!= n) {
if (current.next==null)
return null;
else
current=current.next;
}
return current;
}
public static void change () {
Scanner sc = new Scanner(System.in);
Link h = findStudent();
System.out.println("If you want to change his name press 1;");
System.out.println("If you want to change his age press 2;");
System.out.println("If you want to change his grade press 3;");
int l = sc.nextInt();
if (l==1) {
System.out.println("What name do you want the student to have?");
String newname = sc.nextLine();
Student.setName(newname);
} else if (l==2) {
System.out.println("What age do you want the student to have?");
int j = sc.nextInt();
Student.setAge(j);
}
else if (l==3) {
System.out.println("What grade do you want the student to have?");
int e = sc.nextInt();
Student.setGrade(e);
}
}
public static void show() {
System.out.println(ll);
}
}
What do you want to do?
To add a student press 1
To change something press 2
To see your students press 3
1
What is the student's name;
Tom
What is the student's age;
16
What is the student's grade;
90
What do you want to do?
To add a student press 1
To change something press 2
To see your students press 3
1
What is the student's name;
Eric
What is the student's age;
16
What is the student's grade;
91
What do you want to do?
To add a student press 1
To change something press 2
To see your students press 3
3
[Name: Eric Age: 16 Grade: 91, Name: Eric Age: 16 Grade: 91]
What do you want to do?
To add a student press 1
To change something press 2
To see your students press 3
为什么我在类中添加一个学生时,它是重复的?我认为你的问题是,你的Student.class是静态的
private static String name;
private static int age;
private static int grade;
这一部分告诉java,您只需要一个变量/类。因此,您的链表只存储对相同静态字段的2个引用
您需要删除static关键字。因为您在学生课堂上使用的是静态字段
private static String name;
private static int age;
private static int grade;
静态字段不属于实例,而是属于类本身。
无论您创建了多少个学生实例(使用new
关键字),static
字段的值将在他们之间共享
您必须删除学生类中的static
关键字。
请参阅官方文档:所有问题都是由于您决定在
学生
课堂上使用静态
变量造成的。这意味着,无论您创建了多少Student
对象,整个类中每个变量只有一个副本
使它们非静态。这意味着您必须在Student
类中删除static
的getter和setter
在列表
类中,可以从静态上下文访问getter,例如Student.getName()
。您需要将对象存储在链接中
并将其强制转换为学生
。然后,您将能够对其调用getName()
另一方面,链接
类应该是一个泛型类,例如类链接
,这样当您在列表
类中使用它时,您可以将其用作链接
,因此在引用它所持有的对象时不必强制转换它(它将持有一个t
)
在change
中,您将需要执行类似的操作--对于findStudent
找到的Student
引用的Student,调用该Student对象上的setter,而不是在静态上下文中调用它
此外,在中查找学生
,而不是=
或==
但是如果我删除静态引用,我会有其他多个错误。不用担心,IDE正在帮助您。您还必须从setter/getter函数中删除静态限定符。例如:publicstaticvoidsetgrade这很重要,你要理解static的真正含义,慢慢来。但是如果我删除静态引用,我会出现错误,比如:非静态方法可以引用静态内容你必须从getter和setter中删除static关键字。这是因为您无法从静态方法访问非静态字段。如果您有兴趣了解更多关于static关键字的信息,可以参考以下文档:如何修复change方法中的bug?