我有自己实施的快速方法。我给该方法提供了一系列对象。我如何使用比较器告诉方法对象将被排序的属性? 我已经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;
}
答案 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
方法来以不同方式对对象进行排序。