Java Eclipse集合通过自定义类似比较器的函数对IntList进行排序,无需装箱

Java Eclipse集合通过自定义类似比较器的函数对IntList进行排序,无需装箱,java,eclipse-collections,Java,Eclipse Collections,我正在尝试对一些()对象进行排序。装箱/取消装箱整数的成本在我的程序中是相关的(这正是我使用原语集合的原因)。我想按照以下标准进行排序: 所有负数都在非负数之前 最小(最接近零)数优先 [1,7,0,-9,-3]->[-3,-9,0,1,7] Eclipse集合库中的IntList类是否有允许自定义比较器的排序方法?到目前为止,我还没有找到它,但是定义的符号列表很大,搜索框只匹配精确的字符串,文档几乎不存在(我相信大部分是由方法签名自动生成的) 我最后的办法是写我自己的int比较器和排序函数

我正在尝试对一些()对象进行排序。装箱/取消装箱整数的成本在我的程序中是相关的(这正是我使用原语集合的原因)。我想按照以下标准进行排序:

  • 所有负数都在非负数之前
  • 最小(最接近零)数优先
[1,7,0,-9,-3]->[-3,-9,0,1,7]

Eclipse集合库中的
IntList
类是否有允许自定义比较器的排序方法?到目前为止,我还没有找到它,但是定义的符号列表很大,搜索框只匹配精确的字符串,文档几乎不存在(我相信大部分是由方法签名自动生成的)

我最后的办法是写我自己的int比较器和排序函数,这没什么大不了的,但我宁愿不写


请不要浪费你的时间写一个概念证明分类机,因为我非常感谢。。我知道如何对列表进行排序,只是不知道如何在Eclipse集合文档中查找内容。如果您能提供帮助,请随时将其包含在您的答案中。

IntList是和ImmutableIntList扩展的接口

我看到有一个实现类可以帮助您,在本例中,它是MutableIntList的实现

有一个sorttthis()方法正在执行

Arrays.sort(this.items,0,this.size)

例如,它将返回-9,-3,0,1,7


但是我注意到你想要-3,-9,0,1,7。我不确定这是打字错误还是要求。当您检查它时,我们可以进一步讨论

因为这里也没有“快速”的答案,所以我自己实现了这样一个排序设备

public class IntListUtils {
    public interface IntIntComparator {
        int compare(int a, int b);
    }

    public static void sort(MutableIntList subject, IntIntComparator comparator) {
        quicksort(subject, 0, subject.size() - 1, comparator);
    }

    public static void quicksort(MutableIntList subject, int low, int high, IntIntComparator comparator) {
        if (low >= high) { return; }
        int pivot = partition(subject, low, high, comparator);
        quicksort(subject, low, pivot - 1, comparator);
        quicksort(subject, pivot, high, comparator);
    }

    private static int partition(MutableIntList subject, int low, int high, IntIntComparator comparator) {
        int pivot = subject.get(high);
        int i = low;
        for (int j = low; j <= high - 1; j++) {
            if (comparator.compare(subject.get(j), pivot) < 0) {
                int t = subject.get(i);
                subject.set(i, subject.get(j));
                subject.set(j, t);
                i += 1;
            }
        }
        int t = subject.get(i);
        subject.set(i, subject.get(high));
        subject.set(high, t);
        return i;
    }
}
公共类IntListUtils{
公共接口输入比较器{
整数比较(整数a,整数b);
}
公共静态无效排序(可变IntList主题、IntIntComparator comparator){
快速排序(subject,0,subject.size()-1,comparator);
}
公共静态void快速排序(可变intlist主题、int低、int高、intComparator比较器){
如果(低>=高){return;}
int pivot=分区(主题、低、高、比较器);
快速排序(主题、低位、枢轴-1、比较器);
快速排序(主题、轴、高、比较);
}
私有静态int分区(可变intList主题、int低、int高、intComparator比较器){
int pivot=subject.get(高);
int i=低;
对于(int j=低;j{
//先负后非负
//否则,首先是最小的数字
如果(a==b){返回0;}
if(a<0&&b<0){
返回值(a

编辑:我意识到这种快速排序并不是最快的排序方法,但它所要做的只是比将整个
IntList
转换为
列表
并在排序后返回更快,这将分配O(n)个内存(n较大)当此排序方法就位时。

从版本10.3开始的Eclipse集合中引入了对基元集合的间接排序支持。可变基元集合支持间接排序。您可以在

OP示例如下所示:

@Test
public void soTest()
{
    // [1, 7, 0, -9, -3] -> [-3, -9, 0, 1, 7]
    MutableIntList list = IntLists.mutable.of(1, 7, 0, -9, -3);

    list.sortThis((a, b) -> {
        // negative before non-negative
        // otherwise, smallest numbers first
        if (a == b) { return 0; }
        if (a < 0 && b < 0) {
            return (a < b) ? 1 : -1;
        }
        return (a < b) ? -1 : 1;}
    );

    Assert.assertEquals(IntLists.immutable.of(-3, -9, 0, 1, 7), list);
}
@测试
公共空间测试()
{
// [1, 7, 0, -9, -3] -> [-3, -9, 0, 1, 7]
MutableIntList=IntLists.mutable.of(1,7,0,-9,-3);
列表.排序这((a,b)->{
//先负后非负
//否则,首先是最小的数字
如果(a==b){返回0;}
if(a<0&&b<0){
返回值(a
比较器λ可简化为:

list.sortThis((a, b) ->
        (a < 0 && b < 0) ? Integer.compare(b, a) : Integer.compare(a, b));
list.sort这((a,b)->
(a<0&&b<0)?整数。比较(b,a):整数。比较(a,b));

这不是一个输入错误,这正是我想要一个带有比较器的排序方法的原因。如果是这样,我会创建一个类extends IntArrayList并重写sort。这个()方法IntArrayLists是(据我所知)唯一的标准实现,这很好。不过,我目前在实用程序类中使用静态方法。
list.sortThis((a, b) ->
        (a < 0 && b < 0) ? Integer.compare(b, a) : Integer.compare(a, b));