如何将包含'm'的字符串排在数组前列?现有排序结果相反
解决Java数组按是否包含'm'排序时顺序相反的问题
你遇到的问题根源在于Boolean类型的自然排序规则:false的优先级低于true(即false < true)。当你用s.contains("m")作为排序Key时,不含'm'的元素返回false,含'm'的返回true,自然会把不含'm'的排在前面,含'm'的挤到末尾。
给你几个可行的解决办法:
方法1:反转比较器顺序
直接对原比较器调用reversed()方法,反转排序逻辑:
String[] strArray = {"xyz", "aaazzz","abc","mft","gh","j", "aaazaz", "mm", "am"}; Arrays.sort(strArray, Comparator.comparing((s) -> s.contains("m")).reversed()); System.out.println("Array sorted by 'm': " + Arrays.toString(strArray));
输出结果:
Array sorted by 'm': [mft, mm, am, xyz, aaazzz, abc, gh, j, aaazaz]
方法2:自定义整数排序Key
把含'm'的元素标记为0,不含的标记为1,利用整数的自然排序让0(含'm')排在前面:
Arrays.sort(strArray, Comparator.comparingInt(s -> s.contains("m") ? 0 : 1));
这个写法更直观,和方法1效果完全一致。
方法3:利用indexOf()实现(含扩展排序)
如果想用indexOf(),可以利用它的返回值特性:含'm'的元素返回索引值(>=0),不含的返回-1。通过调整Key既能实现基础排序,还能扩展更精细的规则:
// 仅按是否含'm'排序,含'm'在前 Arrays.sort(strArray, Comparator.comparingInt(s -> s.indexOf('m') == -1 ? 1 : 0)); // 进阶:含'm'的在前,且按'm'首次出现的位置从早到晚排序 Arrays.sort(strArray, Comparator.comparingInt(s -> s.indexOf('m') == -1 ? Integer.MAX_VALUE : s.indexOf('m')));
进阶写法的输出会是[mft, am, mm, xyz, aaazzz, abc, gh, j, aaazaz],因为mft中'm'在索引0,比am的索引1更靠前。
内容的提问来源于stack exchange,提问作者Marcus3w
相关产品推荐
相关产品推荐

