请用最快(最有效率)的方法对以下规则的字符串进行排序
有一些形如以下格式的字符串:
v2.0.9.201008271530
v2.0.8.201006021935
v1.0.7.201006011800
v1.0.6.200912241630
v10.0.5.200910121350
v1.0.4.200909291500
v1.10.3.200908261100
v1.0.2.200908121300
v1.0.10.201009131000
v1.0.1.200907201000
经排序后使得这些版本信息的字符串由高到低排列下来,如:
v10.0.5.200910121350
v2.0.10.201006021935
v2.0.9.201008271530
v1.10.3.200908261100
v1.1.4.200909291500
v1.0.10.201009131000
v1.0.7.201006011800
v1.0.6.200912241630
v1.0.2.200908121300
v1.0.1.200907201000
有一些形如以下格式的字符串:
v2.0.9.201008271530
v2.0.8.201006021935
v1.0.7.201006011800
v1.0.6.200912241630
v10.0.5.200910121350
v1.0.4.200909291500
v1.10.3.200908261100
v1.0.2.200908121300
v1.0.10.201009131000
v1.0.1.200907201000
经排序后使得这些版本信息的字符串由高到低排列下来,如:
v10.0.5.200910121350
v2.0.10.201006021935
v2.0.9.201008271530
v1.10.3.200908261100
v1.1.4.200909291500
v1.0.10.201009131000
v1.0.7.201006011800
v1.0.6.200912241630
v1.0.2.200908121300
v1.0.1.200907201000
public class VersionSorter {
private String[] verList;
public VersionSorter(String[] verList) {
this.verList = verList;
}
public VersionSorter() {
verList = new String[] {
"v1.0.6.200912241630",
"v1.0.4.200909291500",
"v2.0.8.201006021935",
"v1.0.10.201009131000",
"v1.0.8.201006021935",
"v2.0.10.201006021935",
"v2.0.2.201006021935"
};
} public void sort() {
int len1 = verList.length;
String[][] sVer = new String[len1][];
for (int i = 0; i < len1; i++) { // 得到分组
sVer[i] = verList[i].substring(1).split("\\.");
}
long[] lVer = new long[len1]; //每个串映射一个long型数据
int len2 = sVer[0].length - 1;
for (int i = 0; i < len1; i++) { // 赋值
lVer[i] = 0L;
for (int j = 0; j < len2; j++) {
lVer[i] = lVer[i] << 8 | Integer.parseInt(sVer[i][j]); // 转为32位数
}
} for (int i = 0; i < len1; i++) {
for (int j = 0; j < len1; j++) {
if (lVer[i] > lVer[j]) {//由于long型数据和串是映射关系
long lTemp = lVer[i]; //所以
lVer[i] = lVer[j]; //必须
lVer[j] = lTemp; //加入这三行
String sTemp = verList[i];
verList[i] = verList[j];
verList[j] = sTemp;
}
}
}
} public void print(String tip) {
System.out.println(tip);
for (String str : verList) {
System.out.println(str);
}
System.out.println();
} public static void main(String[] args) {
VersionSorter vs = new VersionSorter();
vs.print("排序前");
vs.sort();
vs.print("排序后");
}
}
“v10.0.5.200910121350
v2.0.10.201006021935
v2.0.9.201008271530
v1.10.3.200908261100”
是按字符串中的数字按大小降序排序,而不是按字符顺序排序。
支持!
所以用集合类中的sort方法也是没有用。
这个算法是错的,当数据如下时:
v1.0.10.201009131000
v1.0.1.201009131000
v1.0.1.200907201003
排序的结果仍是:
v1.0.10.201009131000
v1.0.1.201009131000
v1.0.1.200907201003这时正确的结果应该是:
v1.0.10.201009131000
v1.0.1.201009131003
v1.0.1.200907201000
v1.0.10.201009131000
v1.0.1.200907201000
v1.0.1.200907201003
复制时用错了。
但是算法是错的。
public Version(String version){
this.version = version;
String[] fields = version.substring(1).split("\\.");
this.major = Integer.valueOf(fields[0]);
this.minor = Integer.valueOf(fields[1]);
this.build = Integer.valueOf(fields[2]);
this.datetime = Long.valueOf(fields[3]);
} @Override public boolean equals(Object that){
if(that == null) return false;
if(this.getClass() != that.getClass()) return false;
return this.version.equals(((Version)that).version);
} @Override public int compareTo(Version that){
if (this.version.equals(that.version)) return 0;
if (this.major > that.major) return 1;
if (this.major < that.major) return -1;
if (this.minor > that.minor) return 1;
if (this.minor < that.minor) return -1;
if (this.build > that.build) return 1;
if (this.build < that.build) return -1;
if (this.datetime > that.datetime) return 1;
if (this.datetime < that.datetime) return -1;
return 0;
} @Override public int hashCode(){
return version.hashCode();
} @Override public String toString(){
return version;
} private String version;
private int major;
private int minor;
private int build;
private long datetime;
}
public class VersionSortExample{
public static void main(String[] args) {
String[] versions = {"v2.0.9.201008271530",
"v2.0.8.201006021935",
"v1.0.7.201006011800",
"v1.0.6.200912241630",
"v10.0.5.200910121350",
"v1.0.4.200909291500",
"v1.10.3.200908261100",
"v1.0.2.200908121300",
"v1.0.10.201009131000",
"v1.0.1.200907201000",};
Version[] cversions = new Version[versions.length];
for(int i = 0 ; i< versions.length; i++){
cversions[i] = new Version(versions[i]);
}
java.util.Arrays.sort(cversions,new java.util.Comparator<Version>(){
@Override public int compare(Version v1,Version v2){
return -(v1.compareTo(v2));
}
});
for(Version v : cversions){
System.out.println(v);
}
}
}v10.0.5.200910121350
v2.0.9.201008271530
v2.0.8.201006021935
v1.10.3.200908261100
v1.0.10.201009131000
v1.0.7.201006011800
v1.0.6.200912241630
v1.0.4.200909291500
v1.0.2.200908121300
v1.0.1.200907201000
□ □
■ 忍以明志 勤以致远 ■
□ □
■□■□■□■□■□■□■□■
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
String[] datas={
"v10.0.5.200910121350","v1.0.2.200908121300"....
}// 补全
String[] completeData=new String[datas.length];
for(int i=0;i<datas.length;i++){
completeData[i] = CompleteString(datas[i]);
}// 排序
TreeMap<String, Integer> sortedResult = new TreeMap<...>();
for(int i=0;i<datas.length;i++){
sortedResult.put(completeData[i], i);
}// 打印结果
for(String key: sortedResult.keySet()){
system.out.println(datas[sortedResult.get(key)]);
}// 补全函数
String CompleteString(String inStr){
String[] fields = inStr.substr(1,inStr.len()-1).split("\\."); // 去掉v字符,然后按.分隔
StringBuffer result=new StringBuffer();
for(int i=0;i<fields.length-1;i++){
result.append(String.format("%03d",Integer.parseInt(fields[i])));
}
result.append(fields[fields.length-1]);
return result.toString();
}