有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java无法在比较对象属性的情况下使用冒泡排序

对于书籍数组,任务是从用户处获取对象的属性,然后根据其作者、标题或页数的选择进行排序。 我的冒泡排序用于页面计数,但在用户选择作者或标题时不起作用,所以我猜我缺少了参考存储与价值存储,也许? 谢谢

import javax.swing.*;
import java.util.*;
public class LibraryBookSort {

public static void main(String[] args) {
    LibraryBook[] books = new LibraryBook[5];
    LibraryBook tempBook = new LibraryBook();
    String enteredAuthor = "", enteredTitle = "";
    String enteredPageCount;
    String sortBy;
    String displayString = "";
    int parsedSortBy;
    int parsedPageCount;
    int booksLength = books.length;

    // populate the array
    for (int x = 0; x < booksLength; ++x)
        books[x] = new LibraryBook();

    // get property values from user
    for (int x = 0; x < booksLength; ++x)
    {
        enteredTitle = JOptionPane.showInputDialog(null, "Enter book " + (x + 1) + " of 5's title:");
        books[x].setTitle(enteredTitle);
        enteredAuthor = JOptionPane.showInputDialog(null, "Enter book " + (x + 1) + " of 5's author:");
        books[x].setAuthor(enteredAuthor);
        enteredPageCount = JOptionPane.showInputDialog(null, "Enter book " + (x + 1) + " of 5's page count:");
        parsedPageCount = Integer.parseInt(enteredPageCount);
        books[x].setPageCount(parsedPageCount);
    }

    // sort by property values
    sortBy = JOptionPane.showInputDialog("Choose option to sort by: (1) title, (2) author, or (3) page count");
    parsedSortBy = Integer.parseInt(sortBy);

    while (parsedSortBy < 1 || parsedSortBy > 3)
    {
        sortBy = JOptionPane.showInputDialog("Invalid selection, please choose option to sort by: (1) title, (2) author, or (3) page count");
        parsedSortBy = Integer.parseInt(sortBy);
    }

    if (parsedSortBy == 1)
    {
        for (int a = 0; a < booksLength - 1; ++a)
        {
            for (int b = 0; b < booksLength - 1; ++b)
            {
                if (books[b].getTitle().compareTo(books[b+1].getTitle()) > 1)
                {
                    tempBook = books[b];
                    books[b] = books[b+1];
                    books[b+1] = tempBook;
                }
            }
        }
    }
    else if (parsedSortBy == 2)
    {
        for (int a = 0; a < booksLength - 1; ++a)
        {
            for (int b = 0; b < booksLength - 1; ++b)
            {
                if (books[b].getAuthor().compareTo(books[b+1].getAuthor()) > 1)
                {
                    tempBook = books[b];
                    books[b] = books[b+1];
                    books[b+1] = tempBook;
                }
            }
        }
    }
    else
    {
        for (int a = 0; a < booksLength - 1; ++a)
        {
            for (int b = 0; b < booksLength - 1; ++b)
            {   
                if (books[b].getPageCount() > books[b+1].getPageCount())
                {
                    tempBook = books[b];
                    books[b] = books[b+1];
                    books[b+1] = tempBook;
                }
            }
        }
    }

    for (int i = 0; i < booksLength; ++i)
    {
        displayString += (books[i].getTitle() + ", by " + books[i].getAuthor() + ". " + books[i].getPageCount() + " pages.\n");
    }
    JOptionPane.showMessageDialog(null, "Books sorted by your choice:\n\n" + displayString);
}

}


共 (2) 个答案

  1. # 1 楼答案

    比较应该是

    .... > 0
    

    不是

    .... > 1
    

    {}的契约是在相等和某物上返回零>;0表示“较大”和<;0表示“更小”。实际上,这些值是-1、0和+1

  2. # 2 楼答案

    因为您使用的是compareTo方法进行排序,所以必须知道compareTo依赖于词典排序

    oracle文档引用如下:, 这是词典排序的定义。如果两个字符串不同,则要么它们在某个索引处具有不同的字符,该索引是两个字符串的有效索引,要么它们的长度不同,要么两者都不同。如果它们在一个或多个索引位置具有不同的字符,则k是此类索引的最小值;然后使用<;运算符,按字典顺序在另一个字符串之前。在这种情况下,compareTo返回两个字符串中位置k处两个字符值的差值,即:

    这个。字符(k)-另一个字符串。查拉特(k)

    如果索引位置不存在差异,则按字典顺序,较短字符串优先于较长字符串。在这种情况下,compareTo返回字符串长度的差值,即值: 这length()-另一个字符串。长度()