我有一張表,其中前兩位數字是一年,後三位數字是介於0到999之間的一個值,最後2個字符是2個alphaOnly字符。一些示例值:0,0,99001AG,99002FG,54001AG,54050AB,還有一些情況下值只是一個6位的字符串SGP4DC。將會有多個值爲SGP4DC的值。 0是不好的數據,但爲了測試目的,我必須考慮它們。如何創建混合比較器?
特殊情況:由於是兩位數年份,當按降序排序時,從1999年(例如99001A)啓動的排序總是比2000年(例如06001A)排序爲「更大」。特殊處理程序應確保00到56之間的任何項目的排序大於57到99之間的任何項目。
現在我的排序目標是首先按照前兩位數字的順序來處理上述特殊情況。然後用下面的3位數字進行跟蹤。最後只是最後2個字符的字符串排序。最後,用字符串比較不要以2位數字開頭的值。的升序預期排序
實施例將是 60001AG 60002FB 42001AG 42002GD APG4GP APG4GP
再次注意,如果2個前導數字是大於或等於57它代表1957年-1999。如果2位數字小於57,則代表2000-2056。
最後我的代碼。注意我目前在表格中有一些虛假數據,其值爲0.因此,我試圖讓它們比其他所有東西都少。我沒有權力去除0,所以我試圖在他們周圍編碼。 IE 0將始終顯示在上面的排序列表之後。
@Override
public int compare(String o1, String o2) {
if(o1.equals("0") && o2.equals("0")){
return 0;
}
System.out.println("Comparing " + o1 + " and " + o2);
if (o1.length() == 1) {
return -1;
}
if (o2.length() == 1) {
return 1;
}
String o1year = null;
String o2year = null;
Integer obj1year;
Integer obj2year;
if (o1.length() >= 2) {
o1year = o1.substring(0, 2);
}
if (o2.length() >= 2) {
o2year = o2.substring(0, 2);
}
if (isInteger(o1year)) {
if (isInteger(o2year)) {
obj1year = Integer.parseInt(o1year);
obj2year = Integer.parseInt(o2year);
// handles years 2000 - 2056 being greater than anything from
// ##57-##99
if (obj1year < 57 && obj2year > 56) {
return 1;
}
if (obj1year == obj2year) {
int returnValue = compareIncriment(o1, o2);
if(returnValue == 0){
return o1.compareToIgnoreCase(o2);
}
return returnValue;
}
if (obj1year > obj2year) {
return 1;
} else {
return -1;
}
}
return 1;
}
// object 2 starts with a 2 digit year and object 1 didnt
if (isInteger(o2year)) {
return -1;
}
// final return
return o1.compareToIgnoreCase(o2);
}
private int compareIncriment(String o1, String o2) {
// TODO Auto-generated method stub
int inc1;
int inc2;
if(isInteger(o1.substring(2, 4))){
inc1 = Integer.parseInt(o1.substring(2, 4));
}else if(isInteger(o1.substring(2, 3))){
inc1 = Integer.parseInt(o1.substring(2, 3));
}else{
inc1 = Integer.parseInt(o1.substring(2, 2));
}
if(isInteger(o2.substring(2, 4))){
inc2 = Integer.parseInt(o2.substring(2, 4));
}else if(isInteger(o2.substring(2, 3))){
inc2 = Integer.parseInt(o2.substring(2, 3));
}else{
inc2 = Integer.parseInt(o2.substring(2, 2));
}
return inc1 - inc2;
}
更新的代碼***
我現在什麼也看不到我的表,我得到一個比較法違反其總承包的錯誤。
真的沒有混合比較器這樣的東西。對象是可以相互比較的,或者它們不是。關鍵是要指定特定類型項目的「自然排序」規則。如果您可以指定明確定義的規則,那麼應該可以實現表達這些規則的算法。 – scottb 2015-04-01 20:21:34