Java выходит из цикла for после того, как результат найден

avatar
James Connigan
8 августа 2021 в 20:35
69
4
0

У меня есть этот класс

public void findMedia(String title) {
    for(Media mediaByTitle : list) {
        if (mediaByTitle.getTitle().equals(title)) {
            System.out.print(mediaByTitle.toString());
        
        } else {
            System.out.print("Title does not exist\n"); 
            break;
        }
    }
    
}

Что я хочу сделать, так это остановить цикл, когда результат будет найден.

Я понимаю логику поиска каждого элемента списка, однако, как я могу напечатать "Заголовок не существует", ничего не найдено.

Это будет работать нормально, чтобы распечатать список, если он найден, однако, если он не найден, это будет просто пустая строка.

public void findMedia(String title) {
    for(Media mediaByTitle : list) {
        if (mediaByTitle.getTitle().equals(title)) {
            System.out.print(mediaByTitle.toString());
        }
    }
}

Я попробовал несколько разных способов, чтобы понять логику, но я думаю, что в данный момент у меня кончились мозговые клетки.

Источник
Turing85
8 августа 2021 в 20:37
0

Проще всего было бы return;, если совпадение найдено, и добавить System.out.println("Nothing found"); после цикла foreach.

James Connigan
8 августа 2021 в 20:41
0

@ Turing85, это сработало, спасибо

Ответы (4)

avatar
Turing85
8 августа 2021 в 20:41
1

Проще всего было бы return;, если совпадение найдено, и добавить System.out.println("Nothing found"); после цикла foreach.

Обратите внимание, что это необычный вариант использования. Обычно мы возвращаем совпадение (например, индекс, или mediaTitle, или boolean). Если мы возвращаем ссылочный тип, мы можем позволить методу вернуть, например, Optional<String>, затем return Optional.of(mediaByTitle), если совпадение найдено, или Optional.empty(), если совпадение не найдено. Затем мы можем решить на вызывающей стороне через возвращенный Optional, что печатать.

avatar
g00se
8 августа 2021 в 22:20
0

Если вы ищете в списке Media определенный заголовок, наиболее гибким вариантом будет метод, который возвращает ссылку на главный объект, уже присутствующий в списке. Вы можете сделать что-то вроде:

public Media findMedia(String title) {
   return list.stream().filter(m -> m.getTitle().equals(title)).findFirst().orElse(null);
}

Или сделайте то же самое с циклом for, если хотите

avatar
Shivam Puri
8 августа 2021 в 20:43
0

Вы всегда можете добавить логический флаг. Установите его в зависимости от того, какая логика вам нужна, нашелся элемент в списке или нет. Что-то вроде этого;

public void findMedia(String title) {
    boolean isFound = false;
    for(Media mediaByTitle : list) {
        if (mediaByTitle.getTitle().equals(title)) {
            System.out.print(mediaByTitle.toString());
            //change boolean value to true as item was found.
            isFound = true;
            break;
        }
    }
    //since you want to print something when item is not in list, do something like this.
    if(!isFound) {
            System.out.print("Title does not exist\n"); 
    }
}
Turing85
8 августа 2021 в 20:45
1

Вместо ...print("...\n"); мы должны использовать ...println("...").

Shivam Puri
8 августа 2021 в 20:46
0

Я просто скопировал код из OP. Просто добавьте логическую часть, которую я предлагаю в этот код. Но да, хорошая мысль.

Abdul Rafay
8 августа 2021 в 23:08
1

вам не нужно перебирать весь список, если элемент был найден на 5 из 10

avatar
Dawood ibn Kareem
8 августа 2021 в 20:42
0

Есть как минимум два разумных подхода к этому. Во-первых, просто вернуться из метода, как только совпадение будет найдено, и вывести сообщение «не найдено» после цикла.

public void findMedia(String title) {
    for(Media mediaByTitle : list) {
        if (mediaByTitle.getTitle().equals(title)) {
            System.out.print(mediaByTitle.toString());
            return;
        }
    }

    System.out.println("Title does not exist"); 
}

Чуть чище было бы, если бы метод возвращал строку, а не печатал ее, и выполнял печать вне самого метода.

public String findMedia(String title) {
    for(Media mediaByTitle : list) {
        if (mediaByTitle.getTitle().equals(title)) {
            return mediaByTitle.toString();
        }
    }

    return "Title does not exist"; 
}

затем просто напишите System.out.println(findMedia("Whatever"));, чтобы использовать это.