Java - 如何以数字和字母顺序对2D数组进行排序?

时间:2018-01-23 05:26:00

标签: java arrays sorting multidimensional-array comparator

我有一个2D数组字符串。所有列都是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相同时,单词没有顺序。

感谢。

2 个答案:

答案 0 :(得分:0)

我想你想解决下面的问题: 无论输入字符串是什么,您都希望创建一个二维数组,其中每个唯一的单词及其出现次数存储。

现在,您希望根据单词的出现次数降序对该二维数组进行排序,如果出现次数与多个单词的出现次数匹配,则按字母顺序依次对它们进行排序其中。

我没有比较器排序数组,它可能对你有所帮助。

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;
                    }
                }
            }
        }
    }
}

答案 1 :(得分:0)

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

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

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