使用java分类器,即:
Collections.sort(myArrayList, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return x;
}
});
和
myArrayList.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return x;
}
});
围绕&#39; out&#39;标签显示该方法需要600-800毫秒才能完成。
当排序50-100个阵列时,这只是一个太大的延迟。
我的问题是,创建自定义方法来排序数组会更快吗?
上面的代码效果很好,但实现起来太慢......
每个数组(myArrayList)都有大约44个元素。
完成1种排序需要600-800毫秒,因此50-100个阵列可能需要80000毫秒。
可执行文件:
System.out(timeMillis);
Collections.sort(fourtyFourItemsArrayL, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
Item i1 = o1 >= 16 ? player.getInventory().getItem(o1 - 16) : player.getEquipment().getItem(o1 - 1);
Item i2 = o2 >= 16 ? player.getInventory().getItem(o2 - 16) : player.getEquipment().getItem(o2 - 1);
int price1 = i1 == null ? 0 : i1.getDefinitions().getProtectionPrice();
int price2 = i2 == null ? 0 : i2.getDefinitions().getProtectionPrice();
if (price1 > price2)
return -1;
else if (price1 < price2)
return 1;
return 0;
}
});
System.out(timeMillis);
答案 0 :(得分:3)
如果我没弄错的话,Java Collections.sort()使用复杂度为O(n lg n)的排序算法。
如果您想要比Collections.sort()更快地构建自己的排序方法,则需要使用O {n)排序算法,如Radix-Sort或Counting Sort。
如果你的约束只有数组中的50-100个元素,我更喜欢使用Collections.sort()而不是编写大量代码来只排序数字。当n <= 100时,O(n lg n)与O(n)之间没有太大差异。
如果要对50-100个不同的阵列进行排序,可以使用Java Threading。
答案 1 :(得分:0)
如果比较的实现很慢,那么所有排序都会在较大或较小程度上变慢。首先,您确实应该确保在内存中提供排序所需的所有内容。 player.getInventory()。getItem(...)做什么?它是否潜入数据库?还是档案?
如果确实如此,那你就是一个糟糕的旅程。
另外,请考虑每个项目将多次成为compareTo(很多)的一部分。
我建议,不要对List<Integer>
进行排序,而是创建List<Item>
然后对它们进行排序。
这将大大减少您执行的次数Item i1 = o1 >= 16 ? player.getInventory().getItem(o1 - 16) : player.getEquipment().getItem(o1 - 1);
此外,如果i1.getDefinitions().getProtectionPrice()
潜入文件,数据库或类似文件,则需要预先获取。
您可以创建一个只包含Integer的类,而protectionPrice会根据原始列表创建此类的列表,然后对该类进行排序。我几乎可以保证速度提升100倍左右。
总之,我认为您的问题不是排序算法本身,而是您如何实现compareTo,并且更改排序算法无法解决您的问题。