Как мне найти слово в классе, который создан из другого класса? - PullRequest
1 голос
/ 30 апреля 2019

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

Я пытался добиться цели целый день, и я определенно достиг своего предела.Я создал класс «запись», который состоит из имени (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 ]

1 голос
/ 01 мая 2019

Как уже упоминалось в вопросе 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 класса.

0 голосов
/ 01 мая 2019

Извините за неформатированное сообщение. Если типом «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 голосов
/ 01 мая 2019

Вы звоните .contains() на Entry вместо name String.

Вы можете просто использовать потоки 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...