Я знаю, что цикл перебирает каждый элемент массива! Следовательно, он также распечатывает «Джон не найден» перед распечаткой его информации! Как мне просто распечатать его информацию без «Джон не найден»?
Это мой код:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Number of members: ");
int number = scanner.nextInt();
Member m[] = new Member[number];
scanner.nextLine();
for (int i = 0; i < number; i++) {
System.out.print("Name & number:");
String[] input = scanner.nextLine().split(" ", 2);
m[i] = new Member(input[0], input[1]);
}
System.out.println("Information Saved.\n");
boolean condition = true;
while (condition) {
System.out.print("Search a name or type exit: ");
String search = scanner.nextLine();
for (int x = 0; x < m.length; x++) {
if (search.equals(m[x].getName())) {
System.out.print(search + "'s number is " + m[x].getTel() + "\n");
break;
} else if (search.equals("exit")) {
condition = false;
m[x].showAllMembers();
} else if (!search.equals(m[x].getName())){
System.out.print(search + "is not found.\n");
}
}
}
}
Класс участника:
class Member {
private String name, tel;
public Member(String name, String tel ) { // Constructor
this.name = name;
this.tel = tel;
}
// Getter
public String getName() {
return name;
}
// Setter
public void setName(String name) {
this.name = name;
}
// Getter
public String getTel() {
return tel;
}
// Setter
public void setTel(String tel) {
this.tel = tel;
}
public void showAllMembers() {
System.out.print("Name:" + name + ", Number:" + tel + "\n");
}
Результаты:
Спасибо за быстрый ответ! Должен ли я не использовать цикл for, а вместо этого использовать Switch? Я все еще не очень уверен..
Я бы лично рефакторил это: поместил бы код "поиск человека" в свой метод и жить стало бы намного проще. Но нет, здесь оператор switch не поможет.
Ооо да! Большое спасибо~~~ ^^
Извините, вы имеете в виду поместить метод «поиск человека» в класс Member?
Нет, я бы, наверное, до сих пор учился в том же классе, что и main
.
Я предполагаю, что вы можете сделать следующее:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Number of members: ");
int number = scanner.nextInt();
Member m[] = new Member[number];
scanner.nextLine();
for (int i = 0; i < number; i++) {
System.out.print("Name & number:");
String[] input = scanner.nextLine().split(" ", 2);
m[i] = new Member(input[0], input[1]);
}
System.out.println("Information Saved.\n");
boolean condition = true;
while (condition) {
System.out.print("Search a name or type exit: ");
String search = scanner.nextLine();
if (search.equals("exit")) {
condition = false;
// method showAllMembers() should not exists in Member class, it'll be really better to migrate it to the separate method, because one single Member object shouldn't know anything about ALL members
showAllMembers(m);
}
int memberNumber = -1;
for (int x = 0; x < m.length; x++) {
if (search.equals(m[x].getName())) {
memberNumber = x;
break;
}
}
if (memberNumber != -1) {
System.out.print(search + "'s number is " + m[memberNumber].getTel() + "\n");
} else {
System.out.print(search + "is not found.\n");
}
}
public static void showAllMembers(Member members[]) {
for (Member member : members) {
System.out.println("Member name: " + member.getName() + ", number: " + member.getTel());
}
}
}
здесь ошибка: memberNumber = m[x];
Извините, просто замените его на memberNumber = x
;
ах, спасибо, но я так и не понял, где использовать showAllMembers() :')
лучше где-нибудь создать отдельный метод, но вне Member::class. Еще лучше создавать в классе Main, позвольте мне показать вам, как
@kwon, пожалуйста, ознакомьтесь с моим обновленным ответом
Вы можете исправить это, убрав условие не найдено из цикла for. Который будет печатать подробности, если имя было найдено, или печатать не найдено после завершения цикла for для итерации, а переменная «найдено» по-прежнему ложна.
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Number of members: ");
int number = scanner.nextInt();
Member m[] = new Member[number];
scanner.nextLine();
for (int i = 0; i < number; i++) {
System.out.print("Name & number:");
String[] input = scanner.nextLine().split(" ", 2);
m[i] = new Member(input[0], input[1]);
}
System.out.println("Information Saved.\n");
boolean condition = true;
while (condition) {
System.out.print("Search a name or type exit: ");
String search = scanner.nextLine();
boolean found = false;
for (int x = 0; x < m.length; x++) {
if (search.equals(m[x].getName())) {
System.out.print(search + "'s number is " + m[x].getTel() + "\n");
found = true;
break;
} else if (search.equals("exit")) {
condition = false;
m[x].showAllMembers();
}
if (!found) {
System.out.print(search + "is not found.\n");
}
}
}
Это не скомпилируется, так как 0 и 1 не являются допустимыми значениями для boolean
. Кроме того, нет никакого объяснения, что сделало бы этот ответ не очень полезным, даже если бы он работал.
это не сработало :'(, оно все еще показывает "Джон не найден", хотя я добавил
Вы добавили "found = true;" в тогдашнем заявлении?
Код слишком часто печатает сообщение «не найдено», потому что он печатает его каждый раз, когда он находит член, который не соответствует. Вы хотите напечатать его только тогда, когда вы достигли конца цикла for
.
Лично я бы извлек код в метод, что означает, что вы можете просто вернуться, когда найдете член. Я бы также переместил код «проверить на выход» за пределы цикла for
.
Таким образом, ваш цикл while
будет выглядеть так:
// No need for a "condition" variable - just break when we've seen "exit"
while (true) {
System.out.print("Search a name or type exit: ");
String search = scanner.nextLine();
if (search.equals("exit")) {
break;
}
findMember(m, search);
}
И метод findMember
будет выглядеть так:
// TODO: You might want to return the member you've found
private static void findMember(Member[] members, String name) {
for (Member member : members) {
if (name.equals(member.getName()) {
// TODO: use string formatting here
System.out.println(name + "'s number is " + member.getTel());
return;
}
}
System.out.println(name + " is not found.");
}
Подсказка: если у вас есть массив из 100 элементов, сколько раз вы хотите вывести часть «не найдено»? И сколько раз потенциально будет выполняться ваше условие "else"? Кроме того, вам действительно нужно проверять «выход» на каждой итерации цикла?