最近做遊戲中的背包系統中的一個快速整理介面,其實就是按照物品的幾個指定屬性進行排序後更新背包中物品位置。找了一下,發現過載Collections.sort方法可以實現對List中的資料根據其儲存的資料表欄位進行排序。其實還有一種方法,就是對List中物件實現Compareable介面。這種方法沒有使用。
需要排序的規則是先按型別排(升序),型別相同的話看等級(降序,等級高的在前),等級相同的看品質(降序,數值越大品質越高),品質相同按照取得時間排序(取得時間早的在前)。
由於只是簡單的測試,所以所有的程式碼都寫到一個檔案中了。在實際應用時,List中存放的是物品表的對映類物件。排序後需要重新更新表中物品的位置欄位。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class TestCollectionSort {
public static void main(String[] args) {
List itemObjects = new ArrayList();
ItemObject itemObject1 = new ItemObject();
itemObject1.setItemType(1);
itemObject1.setLevel(6);
itemObject1.setQuality(4);
itemObject1.setObtainDate(1234);
itemObjects.add(itemObject1);
ItemObject itemObject2 = new ItemObject();
itemObject2.setItemType(3);
itemObject2.setLevel(6);
itemObject2.setQuality(4);
itemObject2.setObtainDate(1234);
itemObjects.add(itemObject2);
ItemObject itemObject3 = new ItemObject();
itemObject3.setItemType(1);
itemObject3.setLevel(6);
itemObject3.setQuality(3);
itemObject3.setObtainDate(1265);
itemObjects.add(itemObject3);
ItemObject itemObject4 = new ItemObject();
itemObject4.setItemType(2);
itemObject4.setLevel(4);
itemObject4.setQuality(3);
itemObject4.setObtainDate(1265);
itemObjects.add(itemObject4);
ItemObject itemObject5 = new ItemObject();
itemObject5.setItemType(1);
itemObject5.setLevel(6);
itemObject5.setQuality(3);
itemObject5.setObtainDate(1234);
itemObjects.add(itemObject5);
//列印出初始結果
System.out.println("初始情況:");
for (ItemObject i : itemObjects) {
System.out.println("type:" + i.getItemType() + "; " +
"level:" + i.getLevel() + "; " +
"quality:" + i.getQuality() + "; " +
"date:" + i.getObtainDate());
}
//排序
Collections.sort(itemObjects, new Comparator() {
public int compare(ItemObject itemObject1, ItemObject itemObject2) {
int type = itemObject1.getItemType() - itemObject2.getItemType();
if (type == 0) {//物品型別相同
int level = itemObject1.getLevel() - itemObject2.getLevel();
if (level == 0) {//等級相同
int quality = itemObject1.getQuality() - itemObject2.getQuality();
if (quality == 0) {//品質
return itemObject1.getObtainDate() - itemObject2.getObtainDate();//獲得時間按照升序排列,早獲得的在前
} else {
return -quality;
}
} else {//物品等級降序排列,等級高的在前
return -level;
}
} else {//物品型別升序(裝備:1 > 耗用品:2 > 道具:3 > 材料:4)
return type;
}
}
});
//列印排序後的結果
System.out.println("排序後:");
for (ItemObject i : itemObjects) {
System.out.println("type:" + i.getItemType() + "; " +
"level:" + i.getLevel() + "; " +
"quality:" + i.getQuality() + "; " +
"date:" + i.getObtainDate());
}
}
}
class ItemObject {
private int level;
private int quality;//白 1 綠 2 籃 3 紫 4 金 5
private int itemType;
private int obtainDate;//獲得物品時間
public int getObtainDate() {
return obtainDate;
}
public void setObtainDate(int obtainDate) {
this.obtainDate = obtainDate;
}
public int getItemType() {
return itemType;
}
public void setItemType(int itemType) {
this.itemType = itemType;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public int getQuality() {
return quality;
}
public void setQuality(int quality) {
this.quality = quality;
}
}
測試結果:
C:UsersAdministratorDesktop>java TestCollectionSort 初始情況: type:1; level:6; quality:4; date:1234 type:3; level:6; quality:4; date:1234 type:1; level:6; quality:3; date:1265 type:2; level:4; quality:3; date:1265 type:1; level:6; quality:3; date:1234 排序後: type:1; level:6; quality:4; date:1234 type:1; level:6; quality:3; date:1234 type:1; level:6; quality:3; date:1265 type:2; level:4; quality:3; date:1265 type:3; level:6; quality:4; date:1234