当前位置: 首页 > 知识库问答 >
问题:

按特定条件在列表中查找对象

杜志
2023-03-14

我有一个清单,必须找到具体的对象。我必须按学生平均价值排序列表,并创建函数来搜索具有第二高价值的学生。如果与其他学生重复,则按函数返回较小的学生。这个任务的另一个要求(要妥善解决)是我不能创建任何对象。下面我留下了我正在使用的类的代码:

import java.time.LocalDate;
import java.util.Comparator;
import java.util.List;

public class Student implements Comparator<Student>{
private String firstName;
private String lastName;
private LocalDate dateOfBirth;
private double averageMark;

public double getAverageMark() {
    return averageMark;
}

   
//function below must find student that I described upper. Currently 
//function is incomplete because I still try to find correct solution 
public static Student findSecondBestStudent(List<Student> students) {


    return students.stream().sorted(Comparator.reverseOrder());
}

@Override
public int compare(Student o1, Student o2) {
    return (int) (o1.getAverageMark() - o2.getAverageMark());
}
}

现在,我尝试通过对stream进行反向排序来解决这个问题,然后移除stream的第一个值,并比较stream的两个下一个对象并返回正确的一个。我可以使用for循环来解决它,但是这个解决方案与任务的条件不匹配(需要创建对象)

共有1个答案

左丘宜年
2023-03-14

实现comparable而不是comparator

使compareTo函数按所需顺序对学生进行排序(相反)

进行排序,跳过1个条目,返回下一个条目。

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

public class Student implements Comparable<Student> {
  private String firstName;
  private String lastName;
  private LocalDate dateOfBirth;
  private double averageMark;
  
  public Student(String firstName, String lastName, LocalDate dateOfBirth, double averageMark) {
    super();
    this.firstName = firstName;
    this.lastName = lastName;
    this.dateOfBirth = dateOfBirth;
    this.averageMark = averageMark;
  }

  public double getAverageMark() {
    return averageMark;
  }

  //function below must find student that I described upper. Currently 
  //function is incomplete because I still try to find correct solution 
  public static Student findSecondBestStudent(List<Student> students) {
    return students.stream().sorted().skip(1).findFirst().orElse(null);
  }

  @Override
  public int compareTo(Student other) {
    if (other == null)
      return 1;
    if (other.averageMark == averageMark) {
      if (other.dateOfBirth == null)
        return -1;
      return other.dateOfBirth.compareTo(dateOfBirth);
    }
    return Double.compare(other.averageMark, averageMark);
  }

  @Override
  public String toString() {
    return "Student [firstName=" + firstName + ", lastName=" + lastName + ", dateOfBirth=" + dateOfBirth
        + ", averageMark=" + averageMark + "]";
  }
  
  public static void main(String[] args) {
    final List<Student> students = new ArrayList<>(6);
    students.add(new Student("Peter", "Tibbitts", LocalDate.of(2001, 4, 6), 5));
    students.add(new Student("Leon", "Gaston", LocalDate.of(1951, 6, 17), 12));
    students.add(new Student("Eric", "Carter", LocalDate.of(1945, 12, 24), 9));
    students.add(new Student("Richard", "Heard", LocalDate.of(1984, 5, 9), 4));
    students.add(new Student("Frankie", "Bonner", LocalDate.of(1970, 4, 19), 10));
    students.add(new Student("Donald", "Pascal", LocalDate.of(2000, 3, 26), 10));
    
    final Student result = Student.findSecondBestStudent(students);
    System.out.println(result);
  }
  
}
 类似资料:
  • 在进行jOOQ不可知(无代码生成)迁移时,我遇到了一种情况,需要检查数据库中是否存在约束(唯一的外键),以便完成进一步的操作。 到目前为止,我尝试的是运行drop并尝试捕获异常,但它使事务失败,并停止后续迁移 设置: Spring jOOQ无需代码生成 FlywayDB作为迁移库 Postgres

  • 问题内容: 查询条件应支持布尔运算符和正则表达式。我已经读过关于Booleano的文章,但是它不支持正则表达式。 如果没有满足此要求的东西,那将是开始构建的最佳技术? 以下示例中的语法只是一个示例,但是它提供的功能应该存在。 等于 适用于以下清单 问题答案: 我设法使用pyparsing模块解决了这个问题。 为了避免发生冲突,我必须用<>替换regexp(),但是目前所有这些似乎都是最好的解决方案

  • 我在代码中使用条件查询。它总是激发 相反,我想忽略查询中的一列(字段),因为该字段以字节形式存储了大量数据。导致性能问题。 有谁能给出一个主意吗? 一些更新 我在查询中添加了一个投影,它创建了一个类似... 现在问题就像..中的未知列“y4_”以及y8_和y5_的相同错误意味着关闭它给出错误的所有内容。 我把它修改成像... 而且奏效了。但是不知道在HQL里面怎么修改?

  • 我已经为此挣扎了很长一段时间,似乎找不到正确的说法(即使在谷歌的帮助下!) 我想做的是...(我真的希望这有意义) 从表2中的value1查找表1中的value1(以匹配),然后从第一个值匹配的表2 value2更新表1中的value2 到目前为止我有...

  • 我正在尝试编写一个方法,该方法可以在列表列表中找到对象的索引并利用并行性。这是我的代码。 当我运行以下代码时 输出类似于 换句话说,即使在找到对象之后,搜索仍在继续。不应该是短路操作吗?我错过了什么?此外,在迭代列表或锯齿数组时,利用并行性的最佳方法是什么? 编辑 按照@Sotirios回答中的想法,我得到了以下输出 请注意 即使找到答案也继续搜索。

  • 问题内容: 我有以下数据: 对于每组记录(按ParentID分组),我想查找所有没有包含“ A”作为数据值的记录的组。 由于第1组和第6组确实包含至少一个以“ A”作为数据值的记录,因此我不希望看到它们。我只想查看记录4和5(它们是组4的一部分),因为该组中没有记录带有“ A”。 任何帮助是极大的赞赏! 问题答案: 如果表很大,建议建立索引。