簡體   English   中英

不使用Array.sort()或compareTo()按字母順序排列字符串數組?

[英]Alphabetize a string array without using Array.sort() or compareTo()?

我在課堂上做一個練習,您在該練習中從用戶那里取名字並按字母順序輸出它們。 我不允許使用Array.sort()compareTo() 我似乎大部分時間都可以使用它...除了當我輸入a aaa aaa 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;

        }

    }

}

請幫忙!! 謝謝!

提示1:查看輸出。 它看起來像什么?

提示2:基於提示1得出的明顯結論……看一下alphabetize方法……並弄清楚為什么會導致您看到的內容。


Meta提示:我認為您的問題在於,對於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. 您沒有任何注釋可以解釋該方法應返回的內容。 最好的做法是為任何非平凡的方法編寫javadoc注釋,這些注釋會在方法與調用該方法的代碼之間形成“契約”。 在這種情況下,您需要一個注釋,例如“如果X,Y或Z,此方法返回true ,否則返回false

問題在於字母順序:

  1. 首先,如果 :如果a和b的長度相同,則不比較它們的最后一個字符。
  2. 第二和第三,如果 :如果a和b的長度不同,則不考慮最短的最后一個字符
  3. 第四種情況 :如果僅考慮從a讀取的字符高於從b讀取的字符的情況,則還應考慮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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM