Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Взаимодействие между объектами и методами


Автор: PrinceOFF 5.12.2013, 14:49
Есть задача создать некий каталог книг (с набором необходимых полей) и отсортировать книги по заданному полю. Причем, необходимо использовать, геттеры, сеттеры и выделить массив книг в отдельный класс.
Программу вроде написал, но последнее условие никак не дается. Уперся, ну прямо как баран в новые ворота (хотя они для меня действительно новые smile ). Я бы может вопрос и не задавал, но уже 2 недели прошло с момента начала решения, а у меня ступор - и задачу решить не могу и дальше учить новые главы не начинаю... 
Что посоветуете, уважаемые? "Забить" и остановиться на данном этапе на существующем решении с мыслями, что "все придет позже" или продолжать решать (потенциально можно и год еще решать...) и не изучать новую теорию пока не решу задачу по старой.
К слову, соответствующие главы книг и у Васильева, и у Шилдта и Хорстмана перечитал опять (а некоторые и по несколько раз). Читаю - все понятно, как только доходит до этой задачи - ступор! Ну что еще сказать - ступор, он и есть ступор...

Первый листинг:
Код

public class Book {

    private int id;
    private String author;
    private String book_name;
    private int year;
    private int pages;
    private double price;

    public void setId(int id) {
        this.id = id;
    }

    public void setAuthor(String author) {
        this.author = author;
    }
    
    public String getAuthor() {
        return author;
    }

    public void setBook_name(String book_name) {
        this.book_name = book_name;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public void setPages(int pages) {
        this.pages = pages;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public String toString() {
        return "Книга [id: " + id + ", Автор: " + author + ", Название: " + book_name + ", Год издания: " + year + ", Страниц: " + pages
                + ", Цена, руб: " + price + "]";
    }
}


Второй листинг:
Код

public class Main {
    
    public static void main(String[] args) {
        Book book_01 = new Book();
        Book book_02 = new Book();
        Book book_03 = new Book();
        Book book_04 = new Book();

        book_01.setId(01);
        book_01.setAuthor("Schildt");
        book_01.setBook_name("Java. The complete reference");
        book_01.setYear(2013);
        book_01.setPages(1104);
        book_01.setPrice(290000.0);

        book_02.setId(02);
        book_02.setAuthor("Horstman");
        book_02.setBook_name("Java");
        book_02.setYear(2009);
        book_02.setPages(1050);
        book_02.setPrice(350000.0);

        book_03.setId(03);
        book_03.setAuthor("Eckel");
        book_03.setBook_name("Thinking in Java");
        book_03.setYear(2009);
        book_03.setPages(640);
        book_03.setPrice(150000.0);

        book_04.setId(04);
        book_04.setAuthor("Vasiljev");
        book_04.setBook_name("Learning Java");
        book_04.setYear(2010);
        book_04.setPages(351);
        book_04.setPrice(75000.0);

        Book[] list = new Book[4];

        list[0] = book_01;
        list[1] = book_02;
        list[2] = book_03;
        list[3] = book_04;

        for (int i = 0; i < list.length; i++) {
            System.out.println(list[i].toString());
        }

        // Сортировка по авторам
        for (int j = 0; j < list.length; j++) {
            for (int i = j + 1; i < list.length; i++) {
                if (list[i].getAuthor().compareTo(list[j].getAuthor()) < 0) {
                    String t = list[j].getAuthor();
                    list[j].setAuthor(list[i].getAuthor());
                    list[i].setAuthor(t);
                }
            }
            System.out.println("Сортировка по авторам: " + list[j].getAuthor());
        }

    }
    
}

Автор: Pawl 5.12.2013, 17:25
А в чем проблема-то? Вы почти все правильно сделали, 
массив выделили в отдельный класс - Main, только с его заполнением запутались, и сортировку  можно было выполнить стандпртными средствами:
Код

import static java.util.Arrays.*;
...
    public static void main(String ...args) {
        Book [] books = new Book[4];
        for (int i = 0; i < books.length; i++) {
            books[i] = new Book();
        }
        books[0].setId(01);
        books[0].setAuthor("Schildt");
        books[0].setBook_name("Java. The complete reference");
        books[0].setYear(2013);
        books[0].setPages(1104);
        books[0].setPrice(290000.0);
        books[1].setId(02);
        books[1].setAuthor("Horstman");
        books[1].setBook_name("Java");
        books[1].setYear(2009);
        books[1].setPages(1050);
        books[1].setPrice(350000.0);
        books[2].setId(03);
        books[2].setAuthor("Eckel");
        books[2].setBook_name("Thinking in Java");
        books[2].setYear(2009);
        books[2].setPages(640);
        books[2].setPrice(150000.0);
        books[3].setId(04);
        books[3].setAuthor("Vasiljev");
        books[3].setBook_name("Learning Java");
        books[3].setYear(2010);
        books[3].setPages(351);
        books[3].setPrice(75000.0);
        sort(books, (Book b1, Book b2) -> b1.author.compareTo(b2.author));
        stream(books).forEach(System.out::println);
    }

я тут пользовался java 8 with lambda, она скоро выйдет официально, так что разбирайтесь! smile 

UPD
Можно даже сортировку и печать сделать в одну строку:
Код

import static java.util.Arrays.stream;
...
stream(books).sorted((Book b1, Book b2) -> b1.author.compareTo(b2.author)).forEach(System.out::println);

Автор: PrinceOFF 5.12.2013, 17:39
Цитата(Pawl @ 5.12.2013,  17:25)
А в чем проблема-то? Вы почти все правильно сделали, 
массив выделили в отдельный класс - Main, только с его заполнением запутались...

О как, красиво  smile :
Цитата

Book [] books = new Book[4];
        for (int i = 0; i < books.length; i++) {
            books[i] = new Book();


Только у меня из класса Main стояла задача вынести массив в третий класс, например класс Array. Вот с этим у меня проблемы уже вторую неделю...

Автор: Pawl 5.12.2013, 18:05
Код

public class Massive {
    private Book books[];

    public Massive() {
        books = new Book[4];
        for (int i = 0; i < books.length; i++) {
            books[i] = new Book();
        }
        books[0].setId(01);
        books[0].setAuthor("Schildt");
        books[0].setBook_name("Java. The complete reference");
        books[0].setYear(2013);
        books[0].setPages(1104);
        books[0].setPrice(290000.0);
        books[1].setId(02);
        books[1].setAuthor("Horstman");
        books[1].setBook_name("Java");
        books[1].setYear(2009);
        books[1].setPages(1050);
        books[1].setPrice(350000.0);
        books[2].setId(03);
        books[2].setAuthor("Eckel");
        books[2].setBook_name("Thinking in Java");
        books[2].setYear(2009);
        books[2].setPages(640);
        books[2].setPrice(150000.0);
        books[3].setId(04);
        books[3].setAuthor("Vasiljev");
        books[3].setBook_name("Learning Java");
        books[3].setYear(2010);
        books[3].setPages(351);
        books[3].setPrice(75000.0);
    }

    public Book[] getBook() {
        return books;
    }
}

Код

import static java.util.Arrays.stream;

public class Main {
    public static void main(String ...args) {
        stream(new Massive().getBook()).sorted((Book b1, Book b2) ->
                b1.getAuthor().compareTo(b2.getAuthor()))
                .forEach(System.out::println);
    }
}

Автор: PrinceOFF 6.12.2013, 10:01
В целом (без разбора новых коллекций и функций) понятно.
А у меня загвоздка оказывается была в том, что мне сказали, что объекты массива я должен создать в классе Main, а сам массив, собственно в классе massive. Поля объктов опять же должен заполнить сетерами в классе Main, а перебор массива, опять же в классе Massive... Вот такая вот чехарда получилась, и я все никак не мог понять а почему же я должен разделять на разные классы сам массив и элементы массива - мне казалось это нелогичным... 
Спасибо.

Автор: Pawl 6.12.2013, 13:28
Цитата(PrinceOFF @  6.12.2013,  10:01 Найти цитируемый пост)
А у меня загвоздка оказывается была в том, что мне сказали, что объекты массива я должен создать в классе Main, а сам массив, собственно в классе massive.

Если не секрет, кто это вам дает такие ТЗ?

Автор: PrinceOFF 6.12.2013, 14:46
Цитата

Если не секрет, кто это вам дает такие ТЗ?

Не, не секрет. Это мой коллега по работе, который точно так же как и я изучает java в рабочее и в свободное от работы время...  smile Это он меня "подсадил"...  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)