java - 自定义比较器java中的问题
问题描述
我目前正在用 Java 制作自然排序算法。并且要求是让它跑得快。给定一个输入字符串列表 [1!, 10!, 100, 100!, 2]。预期的输出顺序是 [1!, 2, 10!,100, 100!]。如您所见,他们首先对数字进行排序,然后比较值。但是,在设计案例时让我很头疼。
这是我在设计这个问题时的想法。
给定字符串a
,b
.
(编辑:输入值可能是 100!90!10!1234,里面有多个“!”。抱歉之前没有提到。输入也会有英文字母。但当前版本可以像老板一样处理它)
我创建了四个索引(ind_a1, ind_a2, ind_b1, ind_b2)
情况1:如果是ind_a1
或者ind_b1
触摸!
,则返回-1
情况 2:如果其中一个ind_a1
或ind_b1
触摸字符串的末尾 - 1 返回-1
(当前问题出现在情况 2 中)
案例3:当两个索引都触摸!
时,
案例3.1:检查是否a.substring(ind_a2, ind_a1) == (b.substring(ind_b2, ind_b1)
相等意味着之前的值相同。例如:
1258!100
和1258!10
。
a.substring(ind_a2, ind_a1) = (b.substring(ind_b2, ind_b1) = 1258
案例 3.2:如果它们不相等,那么它只返回之前的比较值。
这是我的完整代码。
public int compare(String a, String b) {
int ind_a1 = 0 ,ind_a2 = 0;
int ind_b1 = 0 ,ind_b2 = 0;
int length_a = a.length();
int length_b = b.length();
int result = a.compareTo(b);
char char_a, char_b;
while(true)
{
char_a = a.charAt(ind_a1);
char_b = b.charAt(ind_b1);
//check if a or b is an empty String
if(length_a == 0 || length_b ==0) {
return length_a - length_b;
}
//Case 1)
if(char_a == '!' && char_b != '!') {
return -1;
}
if(char_b == '!' && char_a != '!') {
return +1;
}
//Case 2: I NEED HELP HERE
if(ind_a1 == length_a-1 || ind_b1 == length_b-1 ) {
return length_a - length_b;
}
//Case 2 corner case, if both string has same length
if(length_a == length_b) {
return result;
}
//Case 3, if both index touch "!"
if(char_a =='!' && char_b == '!' ) {
//Case 3.1
if(a.substring(ind_a2, ind_a1) == (b.substring(ind_b2, ind_b1))) {
ind_a2 = ind_a1;
ind_b2 = ind_b1;
}
//Case 3.2
else {
return a.substring(ind_a2,ind_a1).compareTo(b.substring(ind_b2,ind_b1));
}
}
ind_a1++;
ind_b1++;
}
}
}
当前的输出顺序是 [2, 1!, 10!, 100, 100!]。我知道它不起作用,因为 2 的索引比 1 少!所以它会返回-1。但是,无论如何调整代码(或使其更好,我将不胜感激)以使其工作?
(例如,给定 [A5,a5,A5!,a5!,!A,!a,A,a,1,!] 的输入
输出应该是 [!, !A, !a, 1, A, a, A5, A5!, a5! ])
解决方案
public static void main(String... S) {
List a = Arrays.asList("1!", "10!", "100!", "100", "2");
Collections.sort(a, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int oo1 = 0;
int oo2 = 0;
if (o1.contains("!")) {
oo1 = 1;
o1 = o1.replace("!", "");
}
if (o2.contains("!")) {
oo2 = 1;
o2 = o2.replace("!", "");
}
int result = (Integer.valueOf(o1) - Integer.valueOf(o2));
return result == 0 ? oo1 - oo2 : result;
}
});
System.out.println(a);
}
根据评论
@Psingh 我们不必处理“!!!!!!” 设想。期望值应该是 [2, A, 1!, 10!, 100, 100! ]
public static void main(String... S) {
List a = Arrays.asList("1!", "1!!", "10!", "100!", "100", "2", "A");
Collections.sort(a, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int ooo1 = 0;
int ooo2 = 0;
for (char i : o1.toCharArray()) {
ooo1 += (int) i;
}
for (char i : o2.toCharArray()) {
ooo2 += (int) i;
}
return ooo1 - ooo2;
}
});
System.out.println(a);
}
推荐阅读
- mysql - python中的SQL查询-从前n行中选择包含参数的行
- mongodb - MongoDB:将对象数组转换为数组数组
- php - PHP Ratchet NGINX Failed WebSocket 连接握手错误响应代码:502
- c# - 当我在客户端窗口之间切换时,如何使按钮在服务器窗体上移动?
- python - 选择一个 ID 并给我所有买家
- c# - 如何根据 TextBoxes 的内容增加 ProgressBar 的值?
- android - 无法将文件保存在内部目录中
- html - 在 html 的表格行中添加填充
- javascript - Vue 组件使用 imask.js 获取和设置转换
- java - 当方法肯定是类的一部分时获取 *NoSuchMethodException*