根据拆分字符串的内容,使用 Collections 对字符串数组进行排序
Sort a string array with Collections based on the content of the split string
我有一个字符串数组,中间有一个白色的 space。我想根据白色 space 之前的第一个子串对内容进行排序,然后根据白色 space.
之后的子串对内容进行排序
例如,如果我的数组是这样的:{"Henry 123", "Henry 234", "David 123", "David 234"}
,最后我想要{"David 123", "David 234", "Henry 123", "Henry 234"}
.
我尝试在下面实现一个新的比较器:
import java.util.*;
public class MyClass {
public static void main(String args[]) {
String[] str_arr = {"Henry 123", "Henry 234", "David 123", "David 234"};
Collections.sort(str_arr, new Comparator<String>(){
public int compare(String s1, String s2) {
String[] str1 = s1.split(" ");
String[] str2 = s2.split(" ");
if(str1[0].compareTo(str2[0]) != 0) {
return str1[0].compareTo(str2[0]);
}
return str1[1].compareTo(str2[1]);
}
});
for (int i = 0; i < str_arr.length; i++) {
System.out.printf("%s, ", str_arr[i]);
}
}
}
但是我收到这个错误:
MyClass.java:7: error: no suitable method found for sort(String[],<anonymous Comparator>)
Collections.sort(str_arr, new Comparator(){
^
method Collections.<T#1>sort(List<T#1>) is not applicable
(cannot infer type-variable(s) T#1
(actual and formal argument lists differ in length))
method Collections.<T#2>sort(List<T#2>,Comparator<? super T#2>) is not applicable
(cannot infer type-variable(s) T#2
(argument mismatch; String[] cannot be converted to List<T#2>))
where T#1,T#2 are type-variables:
T#1 extends Comparable<? super T#1> declared in method <T#1>sort(List<T#1>)
T#2 extends Object declared in method <T#2>sort(List<T#2>,Comparator<? super T#2>)
1 error
这个错误听起来像集合框架不支持排序字符串,这没有多大意义。
你有一个String
数组,Collection.sort
方法确实不支持排序。 Collections.sort
用于排序 List
s.
您应该改用 Arrays.sort
:
Arrays.sort(str_arr, (s1, s2) -> {
String[] str1 = s1.split(" ");
String[] str2 = s2.split(" ");
int firstPartcomparison = str1[0].compareTo(str2[0]);
if(firstPartcomparison != 0) {
return firstPartcomparison;
}
return str1[1].compareTo(str2[1]);
});
这是一种方法。
String[] arr = { "Henry 123", "Henry 234", "David 123",
"David 234" };
Comparator<String> comp =
Comparator.comparing(s -> s.split("\s+"),
Comparator.comparing((String[] a) -> a[0])
.thenComparing(a -> a[1]));
Arrays.sort(arr,comp);
System.out.println(Arrays.toString(arr))
打印
[David 123, David 234, Henry 123, Henry 234]
如果要将第二个值作为 int
进行比较,则更改为。
...thenComparingInt(a -> Integer.parseInt(a[1])));
请记住,将数字与字符串进行比较是词汇而非数字,因此结果可能会有所不同。例如,将 [55, 123]
作为字符串进行比较会得到 [123, 55]
,因为 55
在词法上大于 123
。你的解决方案不起作用的原因是数组不是集合,这正是 Collections.sort()
所期望的。
我有一个字符串数组,中间有一个白色的 space。我想根据白色 space 之前的第一个子串对内容进行排序,然后根据白色 space.
之后的子串对内容进行排序例如,如果我的数组是这样的:{"Henry 123", "Henry 234", "David 123", "David 234"}
,最后我想要{"David 123", "David 234", "Henry 123", "Henry 234"}
.
我尝试在下面实现一个新的比较器:
import java.util.*;
public class MyClass {
public static void main(String args[]) {
String[] str_arr = {"Henry 123", "Henry 234", "David 123", "David 234"};
Collections.sort(str_arr, new Comparator<String>(){
public int compare(String s1, String s2) {
String[] str1 = s1.split(" ");
String[] str2 = s2.split(" ");
if(str1[0].compareTo(str2[0]) != 0) {
return str1[0].compareTo(str2[0]);
}
return str1[1].compareTo(str2[1]);
}
});
for (int i = 0; i < str_arr.length; i++) {
System.out.printf("%s, ", str_arr[i]);
}
}
}
但是我收到这个错误:
MyClass.java:7: error: no suitable method found for sort(String[],<anonymous Comparator>) Collections.sort(str_arr, new Comparator(){ ^ method Collections.<T#1>sort(List<T#1>) is not applicable (cannot infer type-variable(s) T#1 (actual and formal argument lists differ in length)) method Collections.<T#2>sort(List<T#2>,Comparator<? super T#2>) is not applicable (cannot infer type-variable(s) T#2 (argument mismatch; String[] cannot be converted to List<T#2>)) where T#1,T#2 are type-variables: T#1 extends Comparable<? super T#1> declared in method <T#1>sort(List<T#1>) T#2 extends Object declared in method <T#2>sort(List<T#2>,Comparator<? super T#2>) 1 error
这个错误听起来像集合框架不支持排序字符串,这没有多大意义。
你有一个String
数组,Collection.sort
方法确实不支持排序。 Collections.sort
用于排序 List
s.
您应该改用 Arrays.sort
:
Arrays.sort(str_arr, (s1, s2) -> {
String[] str1 = s1.split(" ");
String[] str2 = s2.split(" ");
int firstPartcomparison = str1[0].compareTo(str2[0]);
if(firstPartcomparison != 0) {
return firstPartcomparison;
}
return str1[1].compareTo(str2[1]);
});
这是一种方法。
String[] arr = { "Henry 123", "Henry 234", "David 123",
"David 234" };
Comparator<String> comp =
Comparator.comparing(s -> s.split("\s+"),
Comparator.comparing((String[] a) -> a[0])
.thenComparing(a -> a[1]));
Arrays.sort(arr,comp);
System.out.println(Arrays.toString(arr))
打印
[David 123, David 234, Henry 123, Henry 234]
如果要将第二个值作为 int
进行比较,则更改为。
...thenComparingInt(a -> Integer.parseInt(a[1])));
请记住,将数字与字符串进行比较是词汇而非数字,因此结果可能会有所不同。例如,将 [55, 123]
作为字符串进行比较会得到 [123, 55]
,因为 55
在词法上大于 123
。你的解决方案不起作用的原因是数组不是集合,这正是 Collections.sort()
所期望的。