我有一个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相同时,单词没有顺序。
感谢。
答案 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>