public static void add(ArrayList<stu> arr){ stu s=new stu(); Scanner sc=new Scanner(System.in); System.out.println("名字"); String name=sc.nextLine(); System.out.println("年龄"); String age=sc.nextLine(); System.out.println("学号"); String id=sc.nextLine(); System.out.println("地址"); String adddrese=sc.nextLine(); s.setAdresss(adddrese); s.setAge(age); s.setId(id); s.setName(name); arr.add(s); System.out.println("添加成功"); } public static void dele(ArrayList<stu> arr){ Scanner sc=new Scanner(System.in); int i=sc.nextInt(); i+=1; arr.remove(i); System.out.println("删除成功"); } public static void search(ArrayList<stu> arr){ } public static void move(ArrayList<stu> arr){ Scanner sc=new Scanner(System.in); int i=sc.nextInt(); stu s=new stu(); System.out.println("名字"); String name=sc.nextLine(); System.out.println("年龄"); String age=sc.nextLine(); System.out.println("学号"); String id=sc.nextLine(); System.out.println("地址"); String adddrese=sc.nextLine(); s.setAdresss(adddrese); s.setAge(age); s.setId(id); s.setName(name); arr.set(i,s); System.out.println("修改成功"); } public static void show(ArrayList<stu> arr){ System.out.println("学生\t姓名\t年龄\t居住地"); for(int i=0;i<arr.size();i++){ stu s1=arr.get(i); System.out.println(s1.getName()+"\t"+s1.getAge()+"\t"+s1.getId()+"\t"+s1.getAdresss()); } } }这段代码中方法show中的for循环为什么无法输出?
时间: 2024-04-21 08:22:30 浏览: 90
这段代码中方法show中的for循环无法输出的原因是在方法move中,你使用了Scanner类的nextInt()方法来读取整数,然后直接使用nextLine()方法读取字符串。这会导致在读取整数后,按下Enter键时会被nextInt()方法留在缓冲区中,并被作为nextLine()方法的输入。因此,下一个nextLine()方法会直接读取到空字符串,导致无法正确输入学生的姓名。
为了解决这个问题,你可以在读取整数后使用一个额外的nextLine()方法来清空缓冲区中的换行符。在move方法中的代码修改如下:
```java
Scanner sc=new Scanner(System.in);
int i=sc.nextInt();
sc.nextLine(); // 添加这一行来清空缓冲区
stu s=new stu();
// 其他代码不变
```
这样就能够正确地读取学生的姓名,并且show方法中的for循环可以输出正确的结果了。
相关问题
public static void main(String[] args) { while (true) { System.out.println("1.添加"); System.out.println("2.删除"); System.out.println("3.修改"); System.out.println("4.展示"); System.out.println("0.退出"); System.out.println("请输入您的选项"); ArrayList<stu> arr1 = new ArrayList<>(); Scanner sc = new Scanner(System.in); int i = sc.nextInt(); switch (i) { case 1: add(arr1); break; case 4: show(arr1); break; case 0: System.out.println("谢谢使用"); System.exit(0); } } } public static void add(ArrayList<stu> arr){ stu s=new stu(); Scanner sc=new Scanner(System.in); System.out.println("名字"); String name=sc.nextLine(); System.out.println("年龄"); String age=sc.nextLine(); System.out.println("学号"); String id=sc.nextLine(); System.out.println("地址"); String adddrese=sc.nextLine(); s.setAdresss(adddrese); s.setAge(age); s.setId(id); s.setName(name); arr.add(s); System.out.println("添加成功"); } public static void show(ArrayList<stu> arr){ System.out.println("学生\t姓名\t年龄\t居住地"); for(int i=0;i<arr.size();i++){ stu s=arr.get(i); System.out.println(s.getName()+"\t"+s.getAge()+"\t"+s.getId()+"\t"+s.getAdresss()); } }这段代码中在方法add中保存的数据为什么无法用方法show中的for循环输出
根据你提供的代码,方法add中保存的数据应该可以通过方法show中的for循环输出。然而,我注意到你的问题可能是因为在while循环的每次迭代中,你都创建了一个新的ArrayList对象arr1。这导致在每次循环开始时,arr1都是一个空的ArrayList对象,其中没有保存任何学生数据。
为了解决这个问题,你需要将ArrayList对象的创建移到while循环之外,确保所有的学生数据都保存在同一个ArrayList对象中。修改后的代码如下:
```java
public static void main(String[] args) {
ArrayList<stu> arr1 = new ArrayList<>(); // 将ArrayList对象的创建移到while循环之外
while (true) {
System.out.println("1.添加");
System.out.println("2.删除");
System.out.println("3.修改");
System.out.println("4.展示");
System.out.println("0.退出");
System.out.println("请输入您的选项");
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
switch (i) {
case 1:
add(arr1);
break;
case 4:
show(arr1);
break;
case 0:
System.out.println("谢谢使用");
System.exit(0);
}
}
}
public static void add(ArrayList<stu> arr){
stu s=new stu();
Scanner sc=new Scanner(System.in);
System.out.println("名字");
String name=sc.nextLine();
System.out.println("年龄");
String age=sc.nextLine();
System.out.println("学号");
String id=sc.nextLine();
System.out.println("地址");
String adddrese=sc.nextLine();
s.setAdresss(adddrese);
s.setAge(age);
s.setId(id);
s.setName(name);
arr.add(s);
System.out.println("添加成功");
}
public static void show(ArrayList<stu> arr){
System.out.println("学生\t姓名\t年龄\t居住地");
for(int i=0;i<arr.size();i++){
stu s=arr.get(i);
System.out.println(s.getName()+"\t"+s.getAge()+"\t"+s.getId()+"\t"+s.getAdresss());
}
}
```
通过将ArrayList对象的创建移到while循环之外,确保了所有的学生数据都保存在同一个ArrayList对象中,这样在方法show中的for循环就能正确地输出保存的数据了。
public static void add(ArrayList<stu> arr){ stu s=new stu(); Scanner sc=new Scanner(System.in); System.out.println("名字"); String name=sc.nextLine(); System.out.println("年龄"); String age=sc.nextLine(); System.out.println("学号"); String id=sc.nextLine(); System.out.println("地址"); String adddrese=sc.nextLine(); s.setAdresss(adddrese); s.setAge(age); s.setId(id); s.setName(name); arr.add(s); boolean b=judge(arr); if(b==false){ arr.remove(arr.size()-1); } if(b==true){ System.out.println("添加成功"); } } public static boolean judge(ArrayList<stu> arr){ stu s2=arr.get(arr.size()-1); for (int i=0;i<arr.size();i++){ stu s1=arr.get(i); if(s1.getId().equals(s2.getId())){ return false; } } return true; } }这段代码中 judge方法哪里出错了?怎样修改?
在judge方法中,出错的地方是在判断是否有重复学号的逻辑中。当前的逻辑是,遍历arr中的每个stu对象,与最后一个添加的stu对象s2进行比较。如果发现有重复的学号,则返回false。
问题出在,比较的时候仅仅使用了学号(id)进行比较,而没有考虑其他属性(如姓名、年龄、地址)是否相同。因此,如果有两个学生对象的学号相同,但其他属性不同,也会判断为重复。
要修改这个问题,可以在判断学号是否相同的基础上,再判断其他属性是否相同。可以使用equals()方法来比较字符串属性是否相同。
下面是修改后的judge方法:
```java
public static boolean judge(ArrayList<stu> arr) {
stu s2 = arr.get(arr.size() - 1);
for (int i = 0; i < arr.size() - 1; i++) { // 注意遍历范围是 arr.size()-1
stu s1 = arr.get(i);
if (s1.getId().equals(s2.getId()) && s1.equals(s2)) { // 判断学号和其他属性都相同
return false;
}
}
return true;
}
```
这样修改后,judge方法将会比较两个stu对象的学号和其他属性是否都相同,如果有任何一个不同,则认为不是重复的学号。
阅读全文