我有一个dto类,其中存储了一些学生证和特定科目的成绩。基本上是这样的。
List<StudentInfoDTO> studentInfoDTO = new ArrayList<>();
StudentInfoDTO如下所示
public class StudentInfoDTO {
Long studentId;
Short marks;
}
现在我想要分数最小的学生证。
我在下面尝试过,但没有给出预期的结果。
int smallest = 0;
for(int i = 0; i < studentInfoDTO.size(); i++) {
smallest = studentInfoDTO.get(i).getMarks();
int x = studentInfoDTO.get(i).getMarks();
if (x < smallest) {
smallest = x;
}
}
答案 0 :(得分:7)
您还可以使用流,它具有一种方便的方法,称为min()
studentInfoDTO.stream().min(Comparator.comparing(StudentInfoDTO::getMarks));
答案 1 :(得分:5)
您可以通过多种方式实现此目标:
Java 1.4样式:
StudentInfoDTO smallest = null;
for (int i = 0; i < studentInfoDTO.size(); i++) {
StudentInfoDTO current = studentInfoDTO.get(i);
if (smallest == null || current.getMarks() < smallest.getMarks() ) {
smallest = current;
}
}
Java 5样式:
StudentInfoDTO smallest = null;
for (StudentInfoDTO current : studentInfoDTO) {
if (smallest == null || current.getMarks() < smallest.getMarks()) {
smallest = current;
}
}
Java 8样式:
StudentInfoDTO smallest = studentInfoDTO.stream()
.min(Comparator.comparing(StudentInfoDTO::getMarks))
.get();
答案 2 :(得分:3)
在您的代码中,您一次又一次地分配smallest
,而这意味着所有时间都具有最小的标记。另外,您还需要维护学生分数最小的ID,否则以后将无法访问。
int smallest = MAX_MARKS;
int id = -1;
for(int i =0; i<studentInfoDTO.size();i++) {
int x = studentInfoDTO.get(i).getMarks();
if (x < smallest) {
smallest = x;
i = studentInfoDTO.get(i).getStudentId();
}
}
if(id!=-1){
System.out.println("id of smallest marks student : " + id);
}
答案 3 :(得分:2)
Integer minMarks = studentInfoDTO
.stream()
.mapToInt(StudentInfoDTO::getMarks)
.min().orElseThrow(NoSuchElementException::new);
答案 4 :(得分:0)
问题是您正在比较相同的x和最小值。因此,如果条件始终失败。这样可以解决问题。
int smallest = studentInfoDTO.get(0).getMarks();
for(int i =0; i<studentInfoDTO.size() - 1;i++)
{
int x = studentInfoDTO.get(i + 1).getMarks();
if (x < smallest) {
smallest = x;
}
}