Как отсортировать массив объектов в порядке возрастания строкового объекта? - PullRequest
0 голосов
/ 08 февраля 2020

Я должен принять пользовательский ввод (int id, String title, String folder, int pages). Я должен получить вывод в порядке возрастания заголовка строки (лексикографический). Я написал код, но вывод у меня совсем другой.

package zzz;
import java.util.Scanner;
import java.util.Arrays;
import java.util.Collections;

class Book{
    int id;
    String title;
    String folder;
    int pages;
}


public class practice {

    public static void main(String[] args)throws Exception {
        // TODO Auto-generated method stub
    Scanner sc = new Scanner(System.in);
    Book b1 = new Book();
    Book b2 = new Book();
    Book b3 = new Book();
    Book b[]= {b1,b2,b3};
    for(int i=0;i<b.length;i++) {
        b[i].id=sc.nextInt();
        sc.nextLine();
    b[i].title=sc.next();
        sc.nextLine();
        b[i].folder=sc.next();
        b[i].pages=sc.nextInt();
    }
    Book temp = null;
    for(int i=0;i<b.length;i++) {
        for(int j=0;j<b.length-1-i;j++) {
            if(b[i].title.compareTo(b[j].title)<0) {
             temp =b[j];
            b[j]=b[j+1];
            b[j+1]=temp;
        }}
    }
    for(int i=0;i<b.length;i++) {
        System.out.println(b[i].id+" "+b[i].title+" "+b[i].folder+" "+b[i].pages);
    }

    }}

enter image description here

Ответы [ 4 ]

2 голосов
/ 08 февраля 2020

Я бы удалил класс в начале и добавил класс после основного метода следующим образом:

static class Book implements Comparable<Book>{
    int id;
    String title;
    String folder;
    int pages;

    @Override
    public int compareTo(Book other) {
        //If this is backword then switch it to -> other.title.compareTo(this.title);
        return this.title.compareTo(other.title);
     }
}

То же, что и: Реализует Comparable для получения сортировки по алфавиту со строками

Тогда вы можете просто получить массив книг и использовать Arrays.sort(book_arr);

Для вас:

package zzz;
import java.util.Scanner;
import java.util.Arrays;
import java.util.Collections;


public class practice {

    public static void main(String[] args)throws Exception {
        // TODO Auto-generated method stub
    Scanner sc = new Scanner(System.in);
    Book b1 = new Book();
    Book b2 = new Book();
    Book b3 = new Book();
    Book b[]= {b1,b2,b3};
    for(int i=0;i<b.length;i++) {
        b[i].id=sc.nextInt();
        sc.nextLine();
        b[i].title=sc.next();
        sc.nextLine();
        b[i].folder=sc.next();
        b[i].pages=sc.nextInt();
    }

    //Sort!
    Arrays.sort(b);

    for(int i=0;i<b.length;i++) {
        System.out.println(b[i].id+" "+b[i].title+" "+b[i].folder+" "+b[i].pages);
    }

    }
    static class Book implements Comparable<Book>{
        int id;
        String title;
        String folder;
        int pages;

        @Override
         public int compareTo(Book other) {
             return this.title.compareTo(other.title);
         }
     }
}

It works!

0 голосов
/ 08 февраля 2020

Вы можете просто решить вашу проблему, используя stream в java 8, поэтому вместо array вы можете использовать List, тогда вы должны stream it, init это и, наконец, сортировка книг по их title.

В сумме

1 - создание объектов Book (то же самое) как ваш)

2- Создать список книг (вместо массива)

3- Stream bookList, Init каждый объект книги, затем Сортировать их на основе заголовка

4 - Распечатать результат

Я кодировал ваш сценарий следующим образом

public static void main(String[] args)  {

        //Create Book Objects
        Scanner sc = new Scanner(System.in);
        Book b1 = new Book();
        Book b2 = new Book();
        Book b3 = new Book();

        //Create BookList
        List<Book> bookList = new ArrayList<>();
        bookList.add(b1);
        bookList.add(b2);
        bookList.add(b3);

        //Stream bookList, Init Books, Sort them based on the title
        bookList.stream().peek(book -> {

            //Init book objects (id , folder , title , pages)
            book.id = sc.nextInt();
            sc.nextLine();
            book.folder = sc.next();
            sc.nextLine();
            book.title = sc.next();
            sc.nextLine();
            book.pages = sc.nextInt();          

        }).sorted(Comparator.comparing(book -> book.title)).collect(Collectors.toList());


        //Print results
        bookList.forEach(book -> {
            System.out.println(book.title);
        });
    }
0 голосов
/ 08 февраля 2020

Я полагаю, что вы, должно быть, уже прошли Реализует сопоставимость, чтобы получить сортировку по алфавиту со строками

Ниже приведен полный код:

import java.util.Scanner;

class Book implements Comparable<Book> {
    int id;
    String title;
    String folder;
    int pages;

    public int compareTo(Book other) {
        return title.compareTo(other.title);
    }
}

public class Practice {

    public static void main(String[] args) throws Exception {

        Scanner sc = new Scanner(System.in);
        Book b1 = new Book();
        Book b2 = new Book();
        Book b3 = new Book();
        Book b[] = { b1, b2, b3 };
        for (int i = 0; i < b.length; i++) {
            b[i].id = sc.nextInt();
            sc.nextLine();
            b[i].title = sc.next();
            sc.nextLine();
            b[i].folder = sc.next();
            b[i].pages = sc.nextInt();
        }
        Book temp = null;
        for (int i = 0; i < b.length; i++) {
            for (int j = 0; j < b.length - 1 - i; j++) {
                if (b[i].compareTo(b[j]) < 0) {
                    temp = b[j];
                    b[j] = b[j + 1];
                    b[j + 1] = temp;
                }
            }
        }
        for (int i = 0; i < b.length; i++) {
            System.out.println(b[i].id + " " + b[i].title + " " + b[i].folder + " " + b[i].pages);
        }

    }
}

A образец прогона:

1
A
A1
12
3
C
C2
40
4
B
B2
34
1 A A1 12
4 B B2 34
3 C C2 40
0 голосов
/ 08 февраля 2020

Вы получаете исключение NullPointerException, поскольку b[i].title=sc.next(); закомментировано.

Один из способов сделать это, не делая Book Comparable, состоит в сортировке потока:

Stream.of(b)
    .sorted((thisBook,anotherBook) -> thisBook.title.compareTo(anotherBook.title))
    .forEach(bk -> System.out.println(bk.id+" "+bk.title+" "+bk.folder+" "+bk.pages));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...