Alm*_*ett 5 java sorting string algorithm
我有一个项目列表,包括数字和字母,如下所示:
原始清单:
Apple 1
Apple 1
Apple 4
Apple 1A
Apple 1B
Apple 1D
Apple 2A
Apple 2A
Apple 1C
Apple 1B
Apple 2C
Apple 10
Apple 11
Apple 5
Apple 11
Apple 8D
Banana 1
Banana 4
Banana 9D
Banana 9E
Banana 9C
Banana 13
Banana 16
Run Code Online (Sandbox Code Playgroud)
这是从API搜索结果,只能通过字母顺序进行排序Apples和Bananas.现在我想用数字(数字随机带字母A,B,C,D,E)对它进行排序,如下所示:
带有A,B,C,D,E字母的数字应按数字和字母顺序排序.
预期清单:
Apple 1
Apple 1
Apple 1A
Apple 1B
Apple 1B
Apple 1C
Apple 1D
Apple 2
Apple 2A
Apple 2A
Apple 2C
Apple 4
Apple 5
Apple 8D
Apple 10
Apple 11
Banana 1
Banana 4
Banana 9C
Banana 9D
Banana 9E
Banana 13
Banana 16
Run Code Online (Sandbox Code Playgroud)
我已经尝试过这个解决方案,但它按照0-9位开头按照下面的顺序命令所有项目:
private List<Location> sortLocationList(List<Location> locationArrayList){
Collections.sort(locationArrayList, new Comparator<Location>(){
@Override
public int compare(Location o1, Location o2){
return o1.getValue().compareToIgnoreCase(o2.getValue());
}
});
return locationArrayList;
}
public class Location{
public enum LocationType{ADDRESS, STREET, CITY}
private JavascriptObject object;
private LocationType locationType;
private String value;
public Location(LocationType locationType, String value, JavascriptObject object){
this.locationType = locationType;
this.value = value;
this.object = object;
}
}
Run Code Online (Sandbox Code Playgroud)
我的解决方案是返回:
Apple 1
Apple 1
Apple 10
Apple 11
Apple 1A
Apple 1B
Apple 1B
Apple 1C
Apple 1D
Apple 2
Apple 2A
Apple 2A
Apple 2C
Apple 4
Apple 5
Apple 8D
Banana 1
Banana 13
Banana 16
Banana 4
Banana 9C
Banana 9D
Banana 9E
Run Code Online (Sandbox Code Playgroud)
有没有更好的解决方案来排序此列表
提前致谢.
我假设总会有这样的模式:
"something something"
Run Code Online (Sandbox Code Playgroud)
对于该getValue()方法返回的所有值,
并且第二个值"something"始终以带有或不带有尾随字符的数字开头。
下面的代码将每个这样的值分成 3 部分,并按
字母顺序比较第 1 部分,按
数字顺序比较第 2 部分,按字母顺序比较
3d 部分:
private List<Location> sortLocationList(List<Location> locationArrayList){
Collections.sort(locationArrayList, new Comparator<Location>(){
@Override
public int compare(Location o1, Location o2){
String s1 = o1.getValue();
String s2 = o2.getValue();
if (s1.equalsIgnoreCase(s2))
return 0;
String[] tokens1 = s1.split(" ");
String[] tokens2 = s2.split(" ");
if (!tokens1[0].equalsIgnoreCase(tokens2[0]))
return s1.compareToIgnoreCase(s2);
int number1 = Integer.parseInt(tokens1[1].replaceAll("\\D", ""));
int number2 = Integer.parseInt(tokens2[1].replaceAll("\\D", ""));
if (number1 != number2)
return number1 - number2;
String suffix1 = tokens1[1].replaceAll("\\d", "");
String suffix2 = tokens2[1].replaceAll("\\d", "");
return suffix1.compareToIgnoreCase(suffix2);
}
});
return locationArrayList;
}
Run Code Online (Sandbox Code Playgroud)