我有这个字符串列表
Car1
Car2
Car3
......
Carn
我想根据其中的数字对此列表进行排序
例如,如果我有Car3, Car1, Car12, Car45
,
我希望它像Car1, Car3, Car12, Car45
一样排序
我使用过Collections.sort()
,但它会返回Car1, car12, car3, Car45
之类的内容
我该怎么做才能把它按正确顺序排列?
答案 0 :(得分:5)
你需要一个自定义比较器,比如
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);
}
});
答案 1 :(得分:4)
使用此:
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 ());
答案 2 :(得分:3)
排序是字典式的,你得到这个顺序,因为字母表中的1小于3,比较器忽略了接下来的内容。 您需要做的是编写自己的比较器,这将切断“Car”只留下字符串中的数字,然后您需要将该数字的字符串表示形式解析为int并比较整数(作为其中一个解决方案)
答案 3 :(得分: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);
答案 4 :(得分:1)
您需要创建一个自定义Comparator,按您的需要进行排序。然后你可以打电话
Collections.sort(myList, myComparator)
请参阅Collections.sort(List, Comparator)。
您可以在此处阅读比较器:Implementing Java Comparator
答案 5 :(得分:1)
您需要使用比较器重载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;
}
});
答案 6 :(得分:1)
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;
}
}
答案 7 :(得分:0)
Car1是对象,因此您必须为此创建自定义Comparator。并指定它的排序性质。
Collection.Sort()
将指定列表按升序排序,根据其元素的自然顺序排序。只是示例:字符串将像a-z一样,数字是0-9。但是对象没有任何自然顺序。
答案 8 :(得分:0)
这对你有用。但你不能重复
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());