簡體   English   中英

Java-如何按數字和字母順序對2D數組排序?

[英]Java - How to sort a 2D array numerically and alphabetically?

我有一個二維的字符串數組。 所有列都是數字String 我需要按列的降序對數組進行排序,當列相同時,我需要按行中的單詞按字母順序對它們進行排序。

例:

input = "Practice makes perfect. you'll only get Perfect by practice. just practice!"

output: [ ["practice", "3"], ["perfect", "2"],
      ["by", "1"], ["get", "1"], ["just", "1"],
      ["makes", "1"], ["only", "1"], ["youll", "1"]  ]

因此,我完成了所有工作,例如解析input並計算單詞的出現。

因此,我正在使用比較器對它們進行排序,但無法正常工作。 我的2D數組稱為result ,下面是代碼:

Arrays.sort(result, new Comparator<String[]>() {
    @Override
    public int compare(String[] a, String[] b) {
      int diff = b[1].compareTo(a[1]);
      if (diff == 0) {
        diff = b[0].compareTo(a[0]);
      }
      return diff;
    }
  }); 

它們按出現的順序排序就很好了,但是當cols相同時,單詞沒有順序。

謝謝。

我認為您想解決以下問題:無論輸入什么字符串,您都想創建一個二維數組,其中存儲每個唯一單詞及其出現次數。

現在,您要根據單詞的出現次數以降序對2D數組進行排序,如果出現次數在多個單詞的出現次數之間匹配,則根據它們之間的字母順序按降序對它們進行排序。

我在沒有比較器的情況下對數組進行了排序,可能會對您有所幫助。

private static void sort2DArray(String[][] string2DArray) {
    int maxInt;
    String maxKey;
    String maxValue;
    int flag = 0;

    /* Sort the 2D Array */
    for (int m = 0; m < string2DArray.length; m++) {
        maxInt = Integer.parseInt(string2DArray[m][1]);
        for (int n = 0; n < string2DArray.length; n++) {

            /* swap on the basis of word's occurrences */
            if (maxInt > Integer.parseInt(string2DArray[n][1])) {
                maxKey = string2DArray[m][0];
                maxValue = string2DArray[m][1];
                string2DArray[m][0] = string2DArray[n][0];
                string2DArray[m][1] = string2DArray[n][1];
                string2DArray[n][0] = maxKey;
                string2DArray[n][1] = maxValue;
                maxInt = Integer.parseInt(string2DArray[n][1]);
            } else {

                /* swap on the basis of word */
                if (maxInt == Integer.parseInt(string2DArray[n][1])) {
                    flag = string2DArray[m][0].compareToIgnoreCase(string2DArray[n][0]);
                    if (flag > 0) {
                        maxKey = string2DArray[m][0];
                        maxValue = string2DArray[m][1];
                        string2DArray[m][0] = string2DArray[n][0];
                        string2DArray[m][1] = string2DArray[n][1];
                        string2DArray[n][0] = maxKey;
                        string2DArray[n][1] = maxValue;
                    }
                }
            }
        }
    }
}

對於出現的降序和單詞的字母順序,您可以使用以下形式的比較器

Arrays.sort(arr,(a,b) -> a[1].compareTo(b[1])==0? a[0].compareTo(b[0]) : 0-(a[1].compareTo(b[1])));

我使用的是lambda表達式,該表達式基本上檢查出現次數是否相等,如果相等,則比較單詞的值,否則返回帶有更改符號的出現次數的比較(以降序排列)。

暫無
暫無

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

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