2016-09-25 2 views
0

私は2つの配列を一致するインデックスの比率に基づいてソートしたいと思います。したがって、[x]/b [x]の比に基づいて、a []とb []はそれに応じてソートされます。基本的な構造は次のとおりです。Javaで比率に基づいて2つの配列を並べ替える方法は?

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'と思われます。 2つの配列を分割しようとしました。 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を使用していない場合。

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

をし、ペアの配列に配列を入れて:

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(インデックス、新しいコンパレータ){ @Override public int compare(整数o1、整数o2){ 返すDouble.compare(a [o1]/b [o1]、a [ o2]/b [o2]); } }); –

+0

エラー:ソートが見つかりませんの適切な方法(ダブル[]、<匿名コンパレータ>) は、Arrays.sort(ARR、新しいコンパレータ(){ ^ 方法アレイソート(T#1 []、コンパレータ。 )は適用されません (推論された型は上限に適合しません )double 上限:整数、オブジェクト –

+0

エラーmsg:メソッド配列がありません。 (実引数と仮引数リストの長さが異なる) (T#1、...、T#2、...)は、 T#2は型変数です。 メソッド内で宣言されたオブジェクトソート(T#1 []、コンパレータ) T#2メソッドで宣言されたオブジェクト sort(T#2 []、int、int 、Comparator ) –

1

あなたはこのようPairを宣言することができます。それで、ソートするのは簡単です:

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/6または9/7

回答:簡単な方法は、a/bc/dという2つの番号のいずれに対しても行うことです。 a*db*cを探します。 a*dが大きい場合、a/bc/dより大きくなります。それ以外の場合はc/dが大きくなります。

この例によれば、8*7=56>9*6=54であり、従って8/69/7より大きい。

したがって、コンパレータで上記のロジックを使用してください。

関連する問題