2016-09-25 42 views
0

我想根據它們匹配指數的比率對2個數組進行排序。因此,根據a [x]/b [x]的比率,a []和b []會相應地排序。這裏是基本結構:如何根據Java中的比率對兩個數組進行排序?

double[] a = {60.0, 100.0, 120.0}; 
double[] b = {20.0, 50.0, 30.0}; 

r0 = a[0]/b[0] 
r1 = a[1]/b[1] 
r2 = a[2]/b[2] 
... 

我正在處理的Java代碼不起作用。有人能給我一些幫助嗎?

Arrays.sort(ratio, new Comparator<double[]>() { 
    @Override 
    public double compare(double[] a, double[] b) { 
     double r1 = (double)a[i]/b[i]; 
     double r2 = (double)a[i+1]/b[i+1]; 
     return r1 > r2; 
    } 

}); 
+2

我不明白你的意圖,但根據你寫的內容,錯誤似乎是'r1 =(double)a/b'。你試着分開兩個數組。 JVM不知道如何做到這一點。 – MaxG

回答

0

試試這個。

double[] a = new double[10]; 
double[] b = new double[10]; 
// fill data to a and b. 
int[] indexes = IntStream.range(0, a.length) 
    .boxed() 
    .sorted((i, j) -> Double.compare(a[i]/b[i], a[j]/b[j])) 
    .mapToInt(i -> i) 
    .toArray(); 
double[] sortedA = IntStream.of(indexes) 
    .mapToDouble(i -> a[i]) 
    .toArray(); 
double[] sortedB = IntStream.of(indexes) 
    .mapToDouble(i -> b[i]) 
    .toArray(); 

如果您不使用Java8。

double[] a = new double[10]; 
double[] b = new double[10]; 
// fill data 
int length = a.length; 
Integer[] indexes = new Integer[length]; 
for (int i = 0; i < length; ++i) 
    indexes[i] = i; 
Arrays.sort(indexes, new Comparator<Integer>() { 
    @Override public int compare(Integer o1, Integer o2) { 
     return Double.compare(a[o1]/b[o1], a[o2]/b[o2]); 
    } 
}); 
double[] sortedA = new double[length]; 
double[] sortedB = new double[length]; 
for (int i = 0; i < length; ++i) { 
    sortedA[i] = a[indexes[i]]; 
    sortedB[i] = b[indexes[i]]; 
} 
+0

感謝您的建議。但我得到編譯在:Arrays.sort(索引,新的Comparator (){0} {0} {0} [0] [0] [0] [0] o2]/b [o2]); } }); –

+0

錯誤:找到的排序(雙[],<匿名比較>) Arrays.sort(ARR,新比較(){ ^ 方法陣列排序(T#1 [],比較沒有合適的方法)不適用 (推斷的類型不符合上限 推斷:雙重 上限:整數,對象) –

+0

錯誤的答案msg:方法數組。(不能推斷類型變量T#2 (實際和形式參數列表長度不同)) 其中T#1,T0, T#2是類型變量: T#1擴展在方法中聲明的對象sort(T#1 [],比較器) T#2 extends方法中聲明的對象 sort(T#2 [],int,int ,比較器) –

1

可以聲明一個Pair這樣的:

static class Pair { 
    double a; 
    double b; 
    Pair(double a, double b) { 
     this.a = a; 
     this.b = b; 
    } 
} 

,把陣列到對陣列。然後很容易對它們進行分類:

Pair[] p = new Pair[a.length]; 
for (int i = 0; i < p.length; i++) 
    p[i] = new Pair(a[i], b[i]); 

Arrays.sort(p, (p1, p2) -> Double.compare(p1.a/p1.b, p2.a/p2.b)); 

當然,結果是在新的數組中。如果需要,您可以循環並將它們放回ab

0

讓我們先看一個例子:

問:兩者中哪一個更大? 8/69/7

答:一個簡單的方法是對錶格a/bc/d中的任意兩個數字執行以下操作。查找a*db*c。如果a*d更大,則a/b大於c/d,否則c/d更大。

根據示例:8*7=56>9*6=54,因此8/6大於9/7

因此,在比較器中使用上述邏輯。

相關問題