在java中使用自定义快速排序中的比较器

时间:2015-04-12 16:58:16

标签: java quicksort comparator

我有自己实施的快速方法。我给该方法提供了一系列对象。我如何使用比较器告诉方法对象将被排序的属性? 我已经google了一下,发现了如何实现比较器,但不知道如何在搜索方法中使用它,因为我发现每个例子都使用了arrays.sort()。

我需要不同的getter方法来获取不同的属性,我不知道比较器如何帮助它?

我只是需要一些帮助来启动整个事情,或者有人可以设法在网上找到一个好的例子?

    public WifiData[] qsortSSID(WifiData[] array, int left, int right){
    int ll=left;
    int rr=right;

        if (rr>ll){
            String pivot=array[(ll+rr)/2].getSSID();
            //System.out.println(pivot);
            while (ll <=rr){
                //finde erstes element >= pivot
                while(ll<right && array[ll].getSSID().compareTo(pivot) < 0){
                    ll +=1;
                }
                //finde letztes elemtn kleiner gleich pivot
                while(rr>left && array[rr].getSSID().compareTo(pivot) > 0){
                    rr -=1;
                }
                if (ll <=rr){
                    swap(array, ll ,rr);
                    ll +=1;
                    rr -=1;

                }
            }
            if (left < rr){
                qsortSSID(array,left,rr);

            }
            if (ll<right){
                qsortSSID(array,ll,right);
            }
        }



    return array;
}

2 个答案:

答案 0 :(得分:2)

WifiData应通过比较Comparable<WifiData>SSID的{​​{1}}来实现this界面。

您的方法的签名将变为:

other

并且实现将更抽象,所以:

public Comparable[] qsort(Comparable[] array, int left, int right)

将成为:

String pivot=array[(ll+rr)/2].getSSID();

Comparable pivot=array[(ll+rr)/2];

将成为:

while(ll<right && array[ll].getSSID().compareTo(pivot) < 0){

示例:

while(ll<right && array[ll].compareTo(pivot) < 0){

<强>更新
在阅读下面的评论后,您的问题会更清晰。你应该做的是使用Comparator:你可以实现不同的比较器,每个比较器按不同的属性进行排序。

请参阅以下示例:

class WifiData implements Comparable<WifiData> {
    String SSID;

    public String getSSID() {
        return SSID;
    }

    @Override
    public int compareTo(WifiData o) {
        return this.SSID.compareTo(o.getSSID());
    }

    public Comparable[] qsort(Comparable[] array, int left, int right){
        int ll=left;
        int rr=right;

        if (rr>ll){
            Comparable pivot = array[(ll+rr)/2];
            while (ll <=rr){
                while(ll<right && array[ll].compareTo(pivot) < 0){
                    ll +=1;
                }
                while(rr>left && array[rr].compareTo(pivot) > 0){
                    rr -=1;
                }
                if (ll <=rr){
                    swap(array, ll ,rr);
                    ll +=1;
                    rr -=1;
                }
            }
            if (left < rr){
                qsort(array,left,rr);

            }
            if (ll<right){
                qsort(array,ll,right);
            }
        }
        return array;
    }

    void swap(Comparable[] arr, int l, int r) {
        Comparable t = arr[l];
        arr[l] = arr[r];
        arr[r] = t;
    }
}

答案 1 :(得分:0)

这是我用第一个元素对多维数组进行排序的示例Comparator

    private static class FirstItemComparator implements Comparator<int[]> {
        public int compare(int[] first, int[] second) {
            if (first[0] < second[0]) {
                return -1;
            } else if (first[0] == second[0]) {
                return 0;
            } else {
                return 1;
            }
        }
    }

    int[][] test = {{0,1},{4,8},{3,5}, {10,12}, {9,10}};
    Arrays.sort(input, new FirstItemComparator());
    // test is now {{0,1},{3,5},{4,8},{9,10},{10,12}}

通常你只会写一个比较器,如果你要将它传递给一个比较两个实例的静态方法(传递一个Comparator就像在其他语言中传递一个函数)。您可以编写不同的比较器,以几种不同的方式对相同类型的对象进行排序。

如果要将一个实例与另一个实例进行比较,那么您将在类本身上实现接口Comparable(而不是像我一样创建一个新类)。但是,这会对对象强制执行排序,因此您无法编写三个或四个compareTo方法来以不同方式对对象进行排序。