我有这个字符串列表
Car1
Car2
Car3
......
Carn
我想根据其中的数字对该列表进行排序。
例如,如果我有Car3, Car1, Car12, Car45,我希望它被排序为Car1, Car3, Car12, Car45.
我用过Collections.sort(),但它返回类似Car1, car12, car3, Car45.
我应该怎么做才能把它按正确的顺序排列?
我有这个字符串列表
Car1
Car2
Car3
......
Carn
我想根据其中的数字对该列表进行排序。
例如,如果我有Car3, Car1, Car12, Car45,我希望它被排序为Car1, Car3, Car12, Car45.
我用过Collections.sort(),但它返回类似Car1, car12, car3, Car45.
我应该怎么做才能把它按正确的顺序排列?
您需要一个自定义比较器,例如
Collections.sort(list, new Comparator<String>() {
public int compare(String s1, String s2) {
int i1 = Integer.parseInt(s1.replaceAll("\\D", ""));
int i2 = Integer.parseInt(s2.replaceAll("\\D", ""));
return Integer.compare(i1, i2);
}
});
用这个:
class ComparatorOfNumericString implements Comparator<String>{
public int compare(String string1, String string2) {
// TODO Auto-generated method stub
String a = string1.substring(3);
String b = string2.split(3);
return Integer.parseInt(a)-Integer.parseInt(b);
}
}
现在,当排序通过此比较器时,如下所示:
Collections.sort(stringList,new ComparatorOfNumericString ());
排序是按字典顺序排列的,你得到这个顺序是因为 1 在字母表中小于 3,并且比较器忽略接下来的内容。您需要做的是编写自己的比较器,这将削减“汽车”,只留下字符串中的数字,然后您需要将该数字的字符串表示解析为一个整数并比较整数(作为解决方案)
您需要为定义字符串排序Comparator<String>的方法指定一个自定义项。Collections.sort()
这适用于字符串中任何位置的数字,也可以处理没有数字的字符串(回退到自然排序的普通字符串比较):
final Pattern intsOnly = Pattern.compile("\\d+");
Comparator<String> comparator = new Comparator<String>() {
@Override
public int compare(final String string1, final String string2) {
String int1 = null;
String int2 = null;
Matcher matcher1 = intsOnly.matcher(string1);
if (matcher1.find()) {
int1 = matcher1.group();
Matcher matcher2 = intsOnly.matcher(string2);
if (matcher2.find()) {
int2 = matcher2.group();
}
}
if (int1 == null || int2 == null) { return string1.compareTo(string2); }
return Integer.valueOf(int1).compareTo(Integer.valueOf(int2));
}
};
Collections.sort(strings, comparator);
当然,这意味着 Truck1 将在 Car2 之前出现,但根据您的问题,这就是您想要的。
更新:上述解决方案不能确保 Car6 会在 Truck6 之前出现。如果您还想在数字相等的情况下回退到自然字符串排序,请使用以下命令:
final Pattern intsOnly = Pattern.compile("\\d+");
Comparator<String> comparator = new Comparator<String>() {
@Override
public int compare(final String string1, final String string2) {
String int1 = null;
String int2 = null;
Matcher matcher1 = intsOnly.matcher(string1);
if (matcher1.find()) {
int1 = matcher1.group();
Matcher matcher2 = intsOnly.matcher(string2);
if (matcher2.find()) {
int2 = matcher2.group();
}
}
int result = 0;
if (int1 != null && int2 != null) {
result = Integer.valueOf(int1).compareTo(Integer.valueOf(int2));
}
if (result == 0) {
return string1.compareTo(string2);
}
else {
return result;
}
}
};
Collections.sort(strings, comparator);
您需要使用sort带有比较器的重载。以下代码适用于您的特定字符串 (CarXXX):
Collections.sort(carList, new Comparator<String>() {
public int compare(String s1, String s2) {
int t1 = Integer.parseInt(s1.substring(3));
int t2 = Integer.parseInt(s2.substring(3));
return t1 - t2;
}
});
您将需要创建一个自定义 Comparator 来按您想要的方式进行排序。然后你可以打电话
Collections.sort(myList, myComparator)
请参阅Collections.sort(List, Comparator)。
您可以在此处阅读比较器:实现 Java 比较器
Collections.sort() 是正确的,所以只需要编写比较器:
public class testComp implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
int number1 = Integer.parseInt(o1.substring(3, o1.length()));
int number2 = Integer.parseInt(o2.substring(3, o2.length()));
if (number1 > number2) {
return -1;
} else {
return 1;
}
}
Car1 是对象,因此您必须为此创建一个自定义比较器。并指定它的排序性质。
Collection.Sort()is根据其元素的自然顺序,将指定列表按升序排序。只是示例:字符串会像 az 一样,数字是 0-9。但是对象没有任何自然顺序。
这对你有用。但你不能有重复
String text = "Car3, Car1, Car12, Car45";
String[] str = text.split(", ");
Map<Integer,String> myMap=new HashMap<>();
int[] numOnly=new int[str.length];
for (int i = 0; i < str.length; i++) {
numOnly[i] = Integer.parseInt(str[i].replaceAll("\\D", ""));
myMap.put(numOnly[i],str[i]);
}
System.out.println(myMap.values());