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

Java集合排序与自定义排序-速度,java,arrays,sorting,collections,format,Java,Arrays,Sorting,Collections,Format,使用java分类器,即: Collections.sort(myArrayList, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return x; } }); Collections.sort(myArrayList,newcomparator(){ @凌驾 公共整数比较(整数o1,整数

使用java分类器,即:

Collections.sort(myArrayList, new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
        return x;
        }

    });
Collections.sort(myArrayList,newcomparator(){
@凌驾
公共整数比较(整数o1,整数o2){
返回x;
}
});

myArrayList.sort(新的比较器(){
@凌驾
公共整数比较(整数o1,整数o2){
返回x;
}
});
在“out”标记的包围下,该方法需要600-800毫秒才能完成

在对50-100个数组进行排序时,这种延迟太大了

我的问题是,创建自定义方法来排序数组会更快吗

上面的代码工作得很好,但是实现起来太慢了

每个数组(myArrayList)大约有44个元素

完成一次排序需要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);
系统输出(timeMillis);
Collections.sort(fourtyFourItemsArrayL,newcomparator(){
@凌驾
公共整数比较(整数o1,整数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();
如果(价格1>价格2)
返回-1;
否则如果(价格1<价格2)
返回1;
返回0;
}
});
系统输出(时间毫秒);

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

如果您想构建比Collections.sort()更快的自己的排序方法,则需要使用O(n)排序算法,如或


如果您的约束在数组中只有50-100个元素,我更喜欢使用Collections.sort()而不是编写大量代码来对数字进行排序。当n时,O(n lg n)与O(n)之间没有太大区别如果我没有弄错的话,Java Collections.sort()使用复杂度为O(n lg n)的排序算法

如果您想构建比Collections.sort()更快的自己的排序方法,则需要使用O(n)排序算法,如或


如果您的约束在数组中只有50-100个元素,我更喜欢使用Collections.sort()而不是编写大量代码来对数字进行排序。当n时,O(n lg n)与O(n)之间没有太大差异。如果比较的实现很慢,那么所有排序都会或多或少地慢。首先,您确实应该确保排序所需的所有内容都在内存中可用。player.getInventory().getItem(…)做什么?它会潜入数据库吗?还是文件? 如果是这样的话,你就要倒霉了。 此外,考虑每个项目将是一个以上的一部分(多)不止一次。 我建议,不要排序
列表
,而是创建
列表
,然后对它们进行排序。 这将大大减少您执行
项i1=o1>=16的次数?player.getInventory().getItem(o1-16):player.getEquipment().getItem(o1-1)

此外,如果
i1.getDefinitions().getProtectionPrice()
潜入文件、数据库或类似文件,则需要预取该文件。 您可以创建一个只包含整数和protectionPrice的类,基于原始列表创建该类的列表,然后对该列表进行排序。我几乎可以保证速度提高100倍左右


总之,我相信你的问题不是排序算法本身,而是你如何实现compareTo,而改变排序算法并不能解决你的问题。

如果compare的实现很慢,那么所有排序都会或多或少地慢下来。首先,您确实应该确保排序所需的所有内容都在内存中可用。player.getInventory().getItem(…)做什么?它会潜入数据库吗?还是文件? 如果是这样的话,你就要倒霉了。 此外,考虑每个项目将是一个以上的一部分(多)不止一次。 我建议,不要排序
列表
,而是创建
列表
,然后对它们进行排序。 这将大大减少您执行
项i1=o1>=16的次数?player.getInventory().getItem(o1-16):player.getEquipment().getItem(o1-1)

此外,如果
i1.getDefinitions().getProtectionPrice()
潜入文件、数据库或类似文件,则需要预取该文件。 您可以创建一个只包含整数和protectionPrice的类,基于原始列表创建该类的列表,然后对该列表进行排序。我几乎可以保证速度提高100倍左右


总之,我认为您的问题不是排序算法本身,而是如何实现compareTo,更改排序算法不会解决您的问题。

这取决于您的情况。是否需要对数组进行内部和内部排序?或者根据它们所拥有的元素对数组进行排序(通过它们的元素的某些属性比较数组)。这些不是
array
s,而是
List
s。你是指50-100个列表还是列表中的50-100个元素?请提供一个更完整的例子。在潜入这个兔子洞之前,请确保你有数据支持它。用Java衡量性能出人意料地困难。另外,如果您只想对int进行排序,那么最好的第一次尝试是使用int数组,而不是list。它最初可能会比较慢,而且由于JVM预热和JIT编译,速度会更快。我强烈建议您在尝试击败默认排序实现之前,先阅读Java基准测试。另外,关于列表中有多少元素?这取决于。您需要对数组进行排序吗
 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);