0

所以我是Java的初学者,并且正在从一本书中解决问题:

编写一个程序,设置一个字符串变量,其中包含您选择的一段文本。从文本中提取单词并将它们按字母顺序排序。显示排序的单词列表。您可以使用一种称为冒泡排序的简单排序方法。要将数组按升序排序,过程如下: a.从数组中的第一个元素开始,比较连续的元素(0 和 1、1 和 2、2 和 3,依此类推)。湾。如果任何对的第一个元素大于第二个元素,则交换这两个元素。C。对整个阵列重复该过程,直到不需要交换为止。数组元素现在按升序排列。

我的解决方案是:

public class bubbleSort {

    public static void main(String[] args) {

        String Homer = "He was the son of Epikaste and Telemachus. " +
                "He was said to be a court singer ";

        String swap;
        Homer = Homer.replace(',', ' ');
        Homer = Homer.replace('.', ' ');
        Homer = Homer.replace("  ", " ");

        String[] words = Homer.split(" ");

        for(String val:words){
            System.out.println(val);
        }

        System.out.println(" ---- SORTED -------");

        boolean exchange = true;
        while (exchange) {
            exchange = false;
            for (int i = 0; i < (words.length - 1); ++i) {
                if (words[i].charAt(0) > words[i + 1].charAt(0)) {

                    swap = words[i];
                    words[i] = words[i + 1];
                    words[i + 1] = swap;
                    exchange = true;
                }
            }
        }

        for(String val:words){
            System.out.println(val);
        }
    }
}

然而,排序后的输出并不像预期的那样!

他是 Epikaste 和 Telemachus 的儿子,据说他是一名宫廷歌手 ---- SORETED ------- Epikaste He He Telemachus 和一个儿子的法庭说歌手是

我在哪里犯了错误?谢谢 !

4

3 回答 3

2

简单的方法是将所有单词转换为大写或小写。

但是,在 Java 中比较语言单词的正确方法是使用Collator

Collator myCollator = Collator.getInstance(); // optional: pass your locale
if( myCollator.compare("abc", "ABC") < 0 )
    System.out.println("abc is less than ABC");
else
    System.out.println("abc is greater than or equal to ABC");

这样可以确保对带有特殊字符(如“è”或“ä”)的单词进行正确排序。虽然这对您的示例没有影响,但如果您正在学习 Java,请从一开始就学习它。


在您的示例中,在方法的开头创建一个整理器实例并替换

if (words[i].charAt(0) > words[i + 1].charAt(0))

if (myCollator.compare(words[i], words[i+1]) > 0)
于 2013-06-26T20:43:31.823 回答
2

排序大写字母小于ascii中的小写字母以获得正确的排序将所有大写字母更改为小写,反之亦然

于 2013-06-26T20:34:16.427 回答
0

我猜你不喜欢结果是它在小写单词之前对大写(大写)单词进行排序。这并不奇怪,因为大写字符 AZ 使用代码点 65 到 90,而小写字符 az 使用代码点 97 到 122。因此在比较中,大写字符总是比小写字符“小”。

解决方案:将所有单词转换为小写进行比较。为此使用String.toLowerCase()

例如,而不是您的原始代码

for (int i = 0; i < (words.length - 1); ++i) {
    if (words[i].charAt(0) > words[i + 1].charAt(0)) {

做得更像

for (int i = 0; i < (words.length - 1); ++i) {
    String w = words[i].toLowerCase();
    String w1 = words[i+1].toLowerCase();
    if (w.charAt(0) > w1.charAt(0)) {
于 2013-06-26T20:36:40.187 回答