Добрый вечер!

Я пытался добиться цели в течение всего дня, и я определенно достиг своего предела. Я создал класс «запись», который состоит из имени (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;
}
1
Ahmad.s 30 Апр 2019 в 23:59

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.

1
Yug Singh 30 Апр 2019 в 23:14

Вы вызываете .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);
    }
}
0
Samuel Philipp 30 Апр 2019 в 21:24

Извините за неформатированное сообщение. Если типом «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. Еще одна вещь, если вы ищете что-то, пользователь (и вы) ожидаете это «что-то» в результате.

0
D L 30 Апр 2019 в 21:35