最近做游戏中的背包系统中的一个快速整理接口,其实就是按照物品的几个指定特性进行排序后更新背包中物品位置。找了一下,发现重载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:\Users\Administrator\Desktop>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