Java集合排序与自定义排序 - 速度

时间:2017-02-11 09:06:41

标签: java arrays sorting collections format

使用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);

2 个答案:

答案 0 :(得分:3)

如果我没弄错的话,Java Collections.sort()使用复杂度为O(n lg n)的排序算法。

如果您想要比Collections.sort()更快地构建自己的排序方法,则需要使用O {n)排序算法,如Radix-SortCounting 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,并且更改排序算法无法解决您的问题。