Java循环输入跳步问题排查及排序优化咨询
问题分析与解决方案
嘿,我来帮你搞定这两个问题!咱们一步步来拆解:
一、输入跳过的问题原因与修复
你遇到的输入跳步问题,根源在于Scanner的输入处理逻辑:
当你用sc.nextLong()读取电话号码时,它只会读取数字部分,不会消耗掉你输入号码后按下的换行符。当下一次循环执行sc.nextLine()时,它会直接读取这个残留的换行符,导致names[i]被设为空字符串,看起来就像是跳过了姓名输入。
修复方法
在sc.nextLong()之后,添加一行sc.nextLine()来消耗掉残留的换行符,修改后的循环代码如下:
for(int i = 0; i < 5; i++) { System.out.println("Inserisci il nome:"); names[i] = sc.nextLine(); System.out.println("Inserisci il numero di telefono:"); phone_num[i] = sc.nextLong(); // 添加这行,消耗掉nextLong()后残留的换行符 sc.nextLine(); }
另外还要注意,你代码里用==比较字符串的写法是错误的:names[a] == names_unsorted[b]是比较对象的引用地址,不是字符串内容,应该改成names[a].equals(names_unsorted[b]),否则可能出现匹配失败的情况。
二、更简便的排序实现建议
现在用两个数组分别存储姓名和电话,排序后再手动匹配的方式不仅繁琐,还容易出现错误(比如存在重复姓名时,匹配逻辑会出问题)。更优雅的方式是把姓名和电话绑定成一个对象,直接对对象数组排序。
具体实现步骤
- 创建一个
Contact类,封装姓名和电话号码:
class Contact implements Comparable<Contact> { private String name; private long phoneNumber; public Contact(String name, long phoneNumber) { this.name = name; this.phoneNumber = phoneNumber; } // 实现Comparable接口,按姓名字母顺序排序 @Override public int compareTo(Contact other) { return this.name.compareToIgnoreCase(other.name); // 如果需要区分大小写,用this.name.compareTo(other.name) } // 重写toString,方便输出 @Override public String toString() { return "Nome: " + name + ", Numero: " + phoneNumber; } }
- 修改主方法,直接使用
Contact数组处理输入和排序:
import java.util.Arrays; import java.util.Scanner; public class RubricaTelefonica { public static void main(String[] args) { Contact[] contacts = new Contact[5]; Scanner sc = new Scanner(System.in); for(int i = 0; i < 5; i++) { System.out.println("Inserisci il nome:"); String name = sc.nextLine(); System.out.println("Inserisci il numero di telefono:"); long phone = sc.nextLong(); sc.nextLine(); // 同样处理换行符 contacts[i] = new Contact(name, phone); } sc.close(); // 直接对Contact数组排序 Arrays.sort(contacts); // 输出排序后的结果 System.out.println("\nRubrica ordinata per nome:"); for(Contact contact : contacts) { System.out.println(contact); } } }
这种方式的优势在于:
- 数据结构更清晰,姓名和电话始终绑定在一起,不会出现匹配错误
- 排序逻辑封装在
Contact类中,代码更简洁易维护 - 支持更灵活的排序规则(比如改成按电话号码排序,只需要修改
compareTo方法)
内容的提问来源于stack exchange,提问作者BONANDRINI CARLO
相关产品推荐
相关产品推荐

