多条件查询--java算法
文章目录
- 代码网址
- 题目
- 用例
- 解答
- 输入
- 多条件查询
- 优化
代码网址
https://gitee.com/zfranklin/java-intelli-j/blob/master/OD/src/C5My.java
题目
用例
解答
此题考查多条件查询。
输入
身高一行,体重一行,两次循环,可以新增第三列,存放学生编号 i+1。因为下标和编号不匹配,用下标可能会忘记加一而出错。
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] students= new int[n][3];
for (int i=0;i<students.length;i++) {
students[i][0] = sc.nextInt();
}
for (int i=0;i< students.length;i++) {
students[i][1] = sc.nextInt();
students[i][2] = i+1;
}
多条件查询
可以用Arrays.sort
Arrays.sort(students,(a,b)->{
if (a[0] != b[0]) {
return a[0] - b[0];
}
if (a[1] != b[1]) {
return a[1]-b[1];
}
return a[2]-b[2];
});
for (int i=0;i<students.length;i++) {
System.out.print(students[i][2]+" ");
}
第一个参数,传递过来的students二维数组,a和b表示任意两个元素,二维数组的元素就是一维数组,其实就是一行。我们去判断下标为0(身高)是否相等,不相等就返回a[0]-b[0],如果小于0,就是a排在b前面,大于0,b排在a前面。如果相等,就进入后续判断,判断体重,同理,最后判断编号。
lambda表达式判断大小sort函数里面有一个函数作为第二个参数,但是这里并没有明显的单独写一个类和方法,而是用lambda表达式
(参数)->{ }
lambda表达式通常与函数式接口一起使用。函数式接口是指只包含一个抽象方法的接口,我们在实现该接口的时候就可以使用此表达式简化书写。
下面给出不用lambda表达式的版本,可以明显看出比较复杂。
class StudentComparator implements Comparator<int[]> {
@Override
public int compare(int[] a, int[] b) {
if (a[0] != b[0]) {
return a[0] - b[0];
}
if (a[1] != b[1]) {
return a[1] - b[1];
}
return a[2] - b[2];
}
}
使用
Arrays.sort(students, new StudentComparator());
优化
实现comparator接口除了用if判断,还可以用三目表达式
Arrays.sort(students,(a,b)->{
return a[0]!=b[0]?a[0]-b[0]:a[1]!=b[1]?a[1]-b[1]:a[2]-b[2];
});
由于只有一个返回语句,可以省略大括号和return关键字。
Arrays.sort(students, (a, b) -> a[0] != b[0] ? a[0] - b[0] : a[1] != b[1] ? a[1] - b[1] : a[2] - b[2]);
输出
为了避免最后一个数字后面多打印一个空格,我们可以加入判断,不是最后一个i,才打印" "空格,也可以使用StringJoiner。
StringJoiner sj = new StringJoiner(" ");
for (int i=0;i<students.length;i++) {
sj.add(String.valueOf(students[i][2]));
}
System.out.println(sj.toString());
这样就可以避免最后一个数后面会跟一个" "空格,只有数与数之间会有空格每隔。