0

本の配列の場合、割り当ては、ユーザーからオブジェクトの属性を取得し、選択した著者、タイトル、またはページ数に基づいて並べ替えることです。私のバブルソートはページ数では機能しますが、ユーザーが著者またはタイトルを選択したときは機能しないため、参照ストレージと値ストレージで何かが欠けていると思いますか? ありがとう!

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);
}

}

4

2 に答える 2

0

並べ替えに compareTo メソッドを使用しているため、compareTo は辞書式順序に依存することを知っておく必要があります。

オラクルのドキュメントは次のように引用しています。これは辞書式順序付けの定義です。2 つの文字列が異なる場合は、両方の文字列の有効なインデックスであるインデックスで文字が異なるか、長さが異なるか、またはその両方です。1 つ以上のインデックス位置に異なる文字がある場合、k を最小のそのインデックスとします。次に、< 演算子を使用して決定された、位置 k の文字の値が小さい文字列が、辞書式に他の文字列よりも前になります。この場合、compareTo は、2 つの文字列の位置 k にある 2 つの文字値の差、つまり次の値を返します。

this.charAt(k)-anotherString.charAt(k)

それらが異なるインデックス位置がない場合、短い文字列が長い文字列より辞書的に先行します。この場合、compareTo は、文字列の長さの差、つまり値 this.length()-anotherString.length() を返します。

于 2013-09-10T05:39:19.543 に答える
0

比較は

.... > 0

いいえ

.... > 1

のコントラクトはcompareTo、等しい場合はゼロを返し、「大きい」場合は >0 を返し、「小さい」場合は <0 を返します。実際には、値は -1、0、および +1 です。

于 2013-09-10T05:39:30.683 に答える