整数 n, m, k と n 行 m 列の表 a が与えられます。以下の条件をすべて満たすように、 a を行単位でソートしてください。 ・ a の k 列目が昇順になっている ・ a の k 列目の値が等しい 2 つの行では、 a の 1 列目の値が昇順になっている ・ a の k 列目 と a の 1 列目から i 列目までのすべての値が等しい 2 つの行では、 a の i + 1 列目の値が昇順になっている ( 1 ≦ i ≦ m - 1 )
整数 n, m, k と n 行 m 列の表 a が与えられます。以下の条件をすべて満たすように、 a を行単位でソートしてください。 ・ a の k 列目が昇順になっている ・ a の k 列目の値が等しい 2 つの行では、 a の 1 列目の値が昇順になっている ・ a の k 列目 と a の 1 列目から i 列目までのすべての値が等しい 2 つの行では、 a の i + 1 列目の値が昇順になっている ( 1 ≦ i ≦ m - 1 )
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int k = sc.nextInt();
Integer[][] a = new Integer[n][m];
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
a[i][j] = sc.nextInt();
}
}
// ここまでは標準入力
Comparator<Integer[]> comparator = new Comparator<Integer[]>() {
@Override //Comparatorをインスタンス化し匿名classでcompareをオーバーライド
public int compare(Integer[] i1, Integer[] i2) {
int result = 0;
int j = k-1; //最初k番目をソートするのでjをk-1で初期化
while(j<m && result==0){ //jをm列以下、かつ、resultが0のとき、真
result = i1[j]-i2[j]; //列が同値のときはresultは0になる
if(j==k-1){ //jがk-1(k番目)の時は、jを0(列の1番目)にする
j = 0;
}else if(j==k-2){ //jがk-2(k-1番目)の時は、jに2(k番目は比較済なので飛ばす)を加える
j += 2;
}else{ //上記以外はjを1進める
j++;
}
}
return result;
}
};
Arrays.sort(a, comparator); //aをComparatorでソートする
for (Integer[] row : a) {
for(int i=0; i<m-1; i++){
System.out.print(row[i]+" ");
}
System.out.println(row[m-1]);
} //標準出力
}
}
尚、降順にしたい場合はresultを以下のようにします。
Comparator<Integer[]> comparator = new Comparator<Integer[]>() {
@Override
public int compare(Integer[] i1, Integer[] i2) {
int result = 0;
int j = 0;
while(j<m && result==0){
result = i1[j]-i2[j];
j++;
}
return result;
}
};
Arrays.sort(a, (i1, i2) -> i1[k-1] - i2[k-1]);