【问题标题】:Java - How to sort a 2D array numerically and alphabetically?Java - 如何按数字和字母顺序对二维数组进行排序?
【发布时间】:2018-01-23 05:26:00
【问题描述】:

我有一个二维字符串数组。所有的列都是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 并计算单词的出现次数。

所以,我正在使用比较器对它们进行排序,但它不起作用。 我的二维数组名为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;
    }
  }); 

它们按出现排序很好,但是当列相同时,单词没有顺序。

谢谢。

【问题讨论】:

  • "...单词没有顺序"?我不敢苟同:在您的示例中,所有出现 1 次的单词均按字母顺序排列。这不是你想要的吗?
  • @KevinAnderson 很抱歉没有理解,但我认为如果我给你一个例子会更好,
  • @KevinAnderson 这里是输入:“每一本书都是引用;每栋房子都是所有森林、矿山和采石场的引用;每个人都是他所有祖先的引用. " 输出应该是:[["and","4"],["every","3"],["is","3"],["a","3"],["报价","3"],["all","2"],["book","1"],["house","1"],["out","1"],["的","1"],["森林","1"],["矿山","1"],["石头","1"],["采石场","1"],["人","1"],["来自","1"],["他的","1"],["祖先","1"]]
  • 我不明白它是如何按字母顺序排列的,“祖先”不应该在“全部”之后,也许我不明白这个问题@KevinAnderson
  • 请展示您的实际输出,以证明您的问题。在您显示的所需输出中,“祖先”确实出现在“全部”之后,而不是立即之后。

标签: java arrays sorting multidimensional-array comparator


【解决方案1】:

我认为您想解决以下问题: 无论输入字符串是什么,您都希望创建一个 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;
                    }
                }
            }
        }
    }
}

【讨论】:

  • 时间复杂度为 T(n*n) 。
【解决方案2】:

对于出现的降序和单词的字母顺序,您可以使用以下形式的比较器

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

我正在使用一个 lambda 表达式,它基本上检查出现是否相等,如果是,则比较单词的值,否则它返回与改变符号的出现的比较(以降序排列)。

【讨论】:

    猜你喜欢
    • 2013-07-19
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多