наименьший элемент из несортированного массива в Java - PullRequest
0 голосов
/ 12 октября 2018

У меня есть класс 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;
    }                       
}

Ответы [ 5 ]

0 голосов
/ 12 октября 2018

Проблема в том, что вы сравниваете тот же самый х и самый маленький.Так что ваше условие if всегда терпит неудачу.Это решит проблему.

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;
 }
}
0 голосов
/ 12 октября 2018

Это можно сделать несколькими способами:

Стиль 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();
0 голосов
/ 12 октября 2018

Вы также можете использовать потоки, у него есть удобный метод, который называется min ()

studentInfoDTO.stream().min(Comparator.comparing(StudentInfoDTO::getMarks));
0 голосов
/ 12 октября 2018
Integer minMarks = studentInfoDTO
      .stream()
      .mapToInt(StudentInfoDTO::getMarks)
      .min().orElseThrow(NoSuchElementException::new);
0 голосов
/ 12 октября 2018

В своем коде вы снова и снова присваиваете smallest, в то время как он должен иметь самые маленькие отметки за все время.Также вам нужно сохранить идентификатор учащегося с наименьшими оценками, иначе вы не сможете получить к нему доступ позже.

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);
}
...