在不使用Array.sort()或compareTo()的情况下按字母顺序排列字符串数组?

时间:2015-04-03 04:26:36

标签: java arrays string sorting alphabetical

我在课堂上练习,你从用户那里取名并按字母顺序输出。我不允许使用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;

        }

    }

}

请帮忙!!谢谢!

2 个答案:

答案 0 :(得分:3)

提示1:查看输出。它看起来是什么样的?

提示2:基于提示1的明显结论......看看alphabetize方法......并弄清楚为什么会导致你所看到的。


Meta-hint:我认为你的问题在于你没有一个alphabetize应该做的心理模型;即结果的预期含义。这有两个原因:

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

    你的方法既没有做这些事情。

    是的...方法名称 非常重要。

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

答案 1 :(得分:0)

问题出现在alphabetizer中:

  1. 首先如果:如果a和b的长度相同,则不要比较他们的最后一个字符。
  2. 第二和第三,如果:如果a和b的长度不同,则不要考虑最短的最后一个字符
  3. 第四,如果:您只考虑从a读取的char高于从b读取的char的情况,您还应该考虑b高于a的情况。
  4. 提示:只有当您读取的字符等于

    时,循环才会继续

    以下是如何解决您的问题:

    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