Возвращение строки соединенных определенных полей из объектов в HashSet - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь написать геттер для HashSet, где объект содержит несколько атрибутов строк и целых чисел.Getter должен возвращать join String только двух полей String, разделенных запятой, для каждого объекта, который хранится в HashSet.

Я мог бы написать его, используя циклы, и это не сложно, но я бы хотелнайти более короткое, более элегантное и умное решение.Я пытался с String.join (), но он не принимает HashSet объектов.Использование Object.toString () не вариант, потому что toString () должен возвращать больше атрибутов Object, тогда как этот метод получения должен возвращать только два из них.

Давайте представим упрощенную библиотеку с объектом Book и объектом Borrower, где каждая книга, заимствованная заемщиком, хранится в HashSet в объекте Borrower.

import java.util.HashSet;

public class Main{

    public static void main(String []args){

        Borrower john = new Borrower("John");

        Book book1 = new Book("Title1", "Author1", "Isbn1", 100);
        Book book2 = new Book("Title2", "Author2", "Isbn2", 200);
        Book book3 = new Book("Title3", "Author3", "Isbn3", 300);

        john.borrowBook(book1);
        john.borrowBook(book2);
        john.borrowBook(book3);
        System.out.println(john.getBorrowed()); 
            // It should print 
                // Title1, Author1
                // Title2, Author2
                // Title3, Author3     
       }
}

class Book {
    String title;
    String author;
    String isbn;
    int pageNum;

    Book(String t, String a, String i, int p){
        this.title = t;
        this.author = a;
        this.isbn = i;
        this.pageNum = p;
    }

    public String getAuthor() { return author;  }
    public String getTitle() {  return title;   }
}

class Borrower {
    String name;
    HashSet <Book> onLoan = new HashSet<Book>();

    Borrower(String n){
        this.name = n;
    }

    public boolean borrowBook(Book b) {
        return onLoan.add(b);
    }

    public String getBorrowed(){

        if(onLoan.isEmpty())
            return "No books borrowed";
        else{
            // It should return joined string of only title and author for every book in HashSet, 
            //title and author separated with coma, each object in new line, like "title, author \n"
            return "---";   
        }
    }
}

getBorrowed () Borrower должен возвращать объединенную строку тольконазвание и автор для каждой книги в HashSet.

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Вот простое решение с использованием потоков:

public String getBorrowed(){

        if(onLoan.isEmpty())
            return "No books borrowed";
        else{
            return onLoan.stream().map(b -> b.getTitle() + ", " + b.getAuthor()).collect(Collectors.joining("\n"));
        }
    }

Выход:

Title3, Author3
Title2, Author2
Title1, Author1
0 голосов
/ 20 июня 2019

Вы можете использовать API потока Java 8 и комбинацию методов map и redu.

Вот мое решение:

String output = onLoan.stream()
     .map(book -> book.getTitle() + ", " + book.getAuthor())
     .reduce("", (value, current) -> value + "\n" + current);

Это HashSet, поэтому порядок вывода может не соответствовать порядку сложения.

...