【问题标题】:Alphabetize a string array without using Array.sort() or compareTo()?在不使用 Array.sort() 或 compareTo() 的情况下按字母顺序排列字符串数组?
【发布时间】:2015-06-08 04:32:11
【问题描述】:

我在课堂上有一个练习,你从用户那里取名字并按字母顺序输出。我不允许使用Array.sort()compareTo()。我似乎已经让它大部分工作了......除了当我输入像a aaa aa这样的东西时,它会按以下顺序输出:

aaa
aa
a

我真的希望能够按这个顺序输出它:

a
aa
aaa

这是我目前所拥有的:

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

    BufferedReader key =
    new BufferedReader(new InputStreamReader(System.in));

    System.out.println("Alphabetizing names\n");

    System.out.println("Enter names separated by spaces:");
    StringTokenizer names1 = new StringTokenizer(key.readLine());

    int tokens = names1.countTokens();
    String[] names2 = new String[tokens];
    String y;

    for (int a = 0; a < tokens; a++) {

        names2[a] = names1.nextToken();

    }

    System.out.println("\nSorted names:");

    for (int a = 0; a < tokens; a++) {

        for (int b = a + 1; b < tokens; b++) {

            if(alphabetize(names2[a], names2[b])) {

                y = names2[a];
                names2[a] = names2[b];
                names2[b] = y;

            }

        }

    }

    for (int c = 0; c < tokens; c++) {

        System.out.println(names2[c]);

    }

}

static boolean alphabetize(String a, String b) {

    for(int c = 0; ; c++) {

        if((c == a.length()-1) && (c == b.length()-1)) {

            return false;

        }

        if(c == a.length()-1) {

            return true;

        }

        if(c == b.length()-1) {

            return false;

        }

        if((a.toLowerCase().charAt(c) - b.toLowerCase().charAt(c)) > 0) {

            return true;

        }

    }

}

请帮忙!!谢谢!

【问题讨论】:

  • 我正在查看您的代码,但我可以告诉您,它与其他词也有问题

标签: java arrays string sorting alphabetical


【解决方案1】:

提示 1:查看输出。看起来正在发生什么?

提示 2:基于提示 1 的明显结论...查看 alphabetize 方法...并找出导致您所看到的结果的原因。


元提示:我认为你的问题是你没有一个一致的心理模型alphabetize 应该做什么;即结果的预期含义。这有两个原因:

  1. 方法的名称不透明。 “alphabetize”这个词不是一个动词,其含义映射到您尝试执行的操作。 http://www.thefreedictionary.com/alphabetize 链接说:
alphabetize (ˈælfəbəˌtaɪz) or alphabetise. vb (tr)
1. to arrange in conventional alphabetical order
2. to express by an alphabet

你的方法没有做这两件事。

是的...方法名称很重要。

  1. 您没有任何 cmets 来解释该方法应返回的内容。为在方法和调用该方法的代码之间形成“契约”的任何重要方法编写 javadoc 注释被认为是最佳实践。在这种情况下,您需要这样的注释:“如果 X、Y 或 Z,此方法返回 true,否则返回 false

【讨论】:

  • 太棒了 :-) 我喜欢尝试反映思维(方法)的答案
【解决方案2】:

问题出在字母表中:

  1. First if:如果 a 和 b 的长度相同,则不比较它们的最后一个字符。
  2. Second and Third if:如果a和b的长度不同,则不考虑最短的最后一个字符
  3. Fourth if:只考虑从a读取的char高于从b读取的char的情况,还应考虑b高于a的情况。

提示:只有当您读取的字符相等时,循环才会继续,


这里如何解决您的问题:

static boolean alphabetize(String a, String b) {
    char ca;
    char cb;
    for(int c = 0; ; c++) {
        ca = a.toLowerCase().charAt(c);
        cb = b.toLowerCase().charAt(c);
        if((c == a.length()-1) && (c == b.length()-1)) {
            return (ca - cb) > 0;
        } else if(c == a.length()-1) {
            return false;
        } else if(c == b.length()-1) {
            return true;
        } else if (ca - cb != 0) { //if are not equals
            return (ca - cb) > 0;
        }      
    }
}

我尝试过很多字符串,例如:

aaa ccc arc abr ald old mal ald aaaa bbbb aaaa car cro arc dsjd qhjk hdjgsdaj asidasiodu asi

【讨论】:

  • 我认为为他/她重写一个初学者的代码没有帮助。他/她很可能不会理解代码。 IMO,帮助初学者为他/她自己解决问题要好得多。这更难做到......
  • 我不想只是重写代码,事实上我也在写一个解释哪些是问题。我认为知道什么是错的和一个可能的解决方案的例子(如果理解的话)也可以是建设性的。无论如何,我同意你的看法,我真的很喜欢你的回答。谢谢你的评论,下次我会考虑的。
猜你喜欢
  • 2015-01-03
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-02
  • 2014-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多