繁体   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