假设我有一个字符串列表 'ABC123'
、'XXY111'
、'EFG001
' 等等。
我需要用两种方式对这些字符串进行排序,
1) First sorted by the numbers.
2) Then it sorted by the letters.
我尝试使用比较器对字符串进行排序。
首先,我拆分字符串并在开头添加数字,然后使用 Collections.sort()
对列表进行排序。
但我不确定如何以两种方式对它进行排序。
下面是我的代码,
public class SortAlphaNumeric {
static class MyComparator implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
String oo1 = o1.substring(3) + o1.substring(0,3);
String oo2 = o2.substring(3) + o2.substring(0,3);
return oo1.compareTo(oo2);
}
}
public static void main(String[] args) {
String str1 = "ABC123";
String str2 = "ACB111";
String str3 = "XXX003";
String str4 = "XYZ001";
String str5 = "CDE123";
String str6 = "FEG111";
List<String> list = new ArrayList<String>();
list.add(str1);
list.add(str2);
list.add(str3);
list.add(str4);
list.add(str5);
list.add(str6);
System.out.println("Before sorting");
Iterator<String> itr1 = list.iterator();
while(itr1.hasNext()) {
System.out.println(itr1.next());
}
SortAlphaNumeric.MyComparator myComp = new SortAlphaNumeric.MyComparator();
System.out.println("========================");
Collections.sort(list, myComp);
System.out.println("After 1st sorting");
Iterator<String> itr2 = list.iterator();
while(itr2.hasNext()) {
System.out.println(itr2.next());
}
Collections.sort(list, myComp);
System.out.println("After 2nd sorting");
Iterator<String> itr3 = list.iterator();
while(itr3.hasNext()) {
System.out.println(itr3.next());
}
}
}
最佳答案
您可以轻松组合两个比较器,将 0-3
索引比较链接到 3-6
索引比较。
以下是使用子字符串代替 split
的替代方法(进一步简化代码):
Comparator<String> myComp = Comparator.comparing((String s) -> s.substring(3))
.thenComparing(s -> s.substring(0, 3));
// resulting in:
// XYZ001, XXX003, ACB111, FEG111, ABC123, CDE123
假设文本具有这个标准长度,上面的代码消除了对 MyComparator
类的需要。
关于java - 在 Java 中使用比较器自定义排序字母数字字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51708817/