Добрый вечер!
Я пытался добиться цели в течение всего дня, и я определенно достиг своего предела. Я создал класс «запись», который состоит из имени (String), адреса (String) и номера телефона (int). Кроме того, я создал класс под названием phoneDirectory, и он состоит из массива из записи класса.
Моя цель сейчас состоит в том, чтобы создать метод, который ищет в этом массиве заданное имя и выводит всю запись.
Вещи, которые я пробовал до сих пор:
public void searchEntry(String name) {
for(int i = 0; i < directory.length; i++) {
if(directory[i] != null) {
System.out.println(directory[i].contains(name));
}else {
System.out.println("no entry");
}
}
}
}
public void searchEntry(String name) {
for(int i = 0; i < directory.length; i++) {
if(directory[i] != null) {
if(Arrays.asList(directory[i]).contains(name)); //It says: "Unlikely argument type String for contains(Object) on a Collection <entry>"
}else {
System.out.println("no entry");
}
}
}
}
public void searchEntry(String name) {
for(int i = 0; i < directory.length; i++) {
if(directory[i] != null) {
if(directory[i].contains(name)){ //The method contains(String) is undefinded for the type entry
}else {
System.out.println("no entry");
}
}
}
}
И многие другие, выполнив поиск с помощью Google, но ничего не сработало или не дали мне «никакой записи», хотя есть запись со строкой. Я был бы очень признателен, если бы кто-то мог помочь мне с этим. Большое спасибо.
Код для 2 классов:
public class Entry{
private String name;
private String adress;
private int number;
public Entry(String name, String adress, int number) {
super();
this.name = name;
this.adress = adress;
this.number= number;
}
@Override
public String toString() {
return "\n" + name + ": " + adress + " , " + number+ "\n";
}
public class PhoneDirectory{
private Entry[] directory;
public PhoneDirectory(Entry[] directory) {
super();
this.directory= directory;
}
3 ответа
Как упоминалось в вопросе, PhoneDirectory
класс имеет массив типов Entry
с именем directory
, и вы реализовали метод searchEntry
.
Вы можете реализовать searchEntry
, как показано ниже:
public void searchEntry(String name) {
for(int i = 0; i < directory.length; i++) {
if(directory[i] != null) {
if(directory[i].getName().equals(name)){
System.out.println(directory[i]);
break; // assuming name is unique so you don't need to continue looping once name is found
}
}else {
System.out.println("no entry");
}
}
}
Также вам необходимо реализовать getters
внутри вашего класса Entry, поскольку все атрибуты являются частными, чтобы вы могли получить к ним доступ внутри класса Directory
.
Вы вызываете .contains()
на Entry
вместо name
строки.
Вы можете просто использовать потоки Java для поиска результатов:
public void searchEntry(String name) {
Arrays.stream(directory)
.filter(e -> e.name.contains(name))
.forEach(System.out::println);
}
Или, если вы хотите напечатать сообщение, если запись не найдена, вы можете использовать это:
public void searchEntry(String name) {
List<Entry> matches = Arrays.stream(directory)
.filter(e -> e.name.contains(name))
.collect(Collectors.toList());
if (matches.isEmpty()) {
System.out.println("no entry");
} else {
matches.forEach(System.out::println);
}
}
Извините за неформатированное сообщение. Если типом «directory» является Array of entry, то вы не можете найти там String (это «name»)
if(Arrays.asList(directory[i]).contains(name));
Вы должны сравнить имя, которое вы хотите найти и имя из записи. Например: у вас есть эти классы:
public class Entry {
private String name;
public String getName() {
return name;
}
}
public class PhoneDirectory {
private Entry[] entries;
public Entry searchEntry(String name) {
for (Entry entry : entries) {
if (entry.getName().equals(name)) {
return entry;
}
}
throw new RuntimeException("There is no entry with name: "+name);
}
}
После этого я бы посоветовал, если вы не знаете, сколько записей содержат phoneDirectory, а затем использовать List вместо Array. Еще одна вещь, если вы ищете что-то, пользователь (и вы) ожидаете это «что-то» в результате.
Похожие вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].