Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
4
respuestas

[Duda] Buscar por nombres del autor

Queria buscar libros por nombres del autor. Tuve muchos problemas al desear buscarlo quiza se deba a que esta en una lista por lo que pense en un doble stream, pero no logre realizarlo. Me podrian ofrecer alguna guia de ello?

// Busqueda por autor
        System.out.println("Ingresa el nombre del autor del libro a buscar: ");
        var authorLibro = lectura.nextLine();
        json = consumoAPI.obtainData(URL_BASE + "?search=" + authorLibro.replace(" ","+") + "%20");
        var dataAuthorSearch = convierteDatos.obtainData(json, Datos.class);

        Optional<DatosLibro> authorBuscado = dataAuthorSearch.results().stream()
                .filter(a -> a.authors().stream()
                        .anyMatch(author -> author.name().toUpperCase().contains(authorLibro.toUpperCase())))
                .findFirst();

        if (authorBuscado.isPresent()) {
            System.out.println("Libros del Autor " + authorLibro);
            System.out.println(authorBuscado.get());
        } else {
            System.out.println("Autor no Encontrado");
        }

y no sale :c

4 respuestas

yo lo hice asi, si tenes alguna duda consultame pero veo varios errores en tu codigo por ejemplo en la parte del json en el replace, podrias simplificarlo con solo un espacio y que ese espacio sea reemplazado con un + en la parte del optional yo miraria el filter que se ve medio confuso, suerte!

Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad

El buscar por el titulo del libro si me sale. el que no me salia era algo que yo deseaba agregar y era buscar por el nombre del autor del libro. Lo bueno es que si lo logre.

// Busqueda por autor
        System.out.println("Ingresa el nombre del autor del libro a buscar: ");
        var authorLibro = lectura.nextLine();
        json = consumoAPI.obtainData(URL_BASE + "?search=" + authorLibro.replace(" ","+") + "%20");
        var dataAuthorSearch = convierteDatos.obtainData(json, Datos.class);
        // Dividir el nombre del autor ingresado en palabras
        String[] authorWords = authorLibro.toUpperCase().split(" ");

        Optional<DatosLibro> authorBuscado = dataAuthorSearch.results().stream()
                .filter(a -> a.authors().stream()
                        .anyMatch(author -> {
                            String authorName = author.name().toUpperCase();
                            // Verificar si todas las palabras del nombre ingresado están contenidas en el nombre del autor
                            return Arrays.stream(authorWords).allMatch(authorName::contains);
                        }))
                .findFirst();

        if (authorBuscado.isPresent()) {
            System.out.println("Libros del Autor " + authorLibro);
            System.out.println(authorBuscado.get());
        } else {
            System.out.println("Autor no Encontrado");
        }

Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad

.findFirst(); -> hasta donde entiendo te devolverá solo 1 coincidencia... la primera que encuentre.....y creo que lo que buscas es una listas o colección de los libros del autor. Yo lo hice de la forma en que envie en la imagen