Как я могу обернуть максимальное значение моего алгоритма в функцию? - PullRequest
0 голосов
/ 16 января 2019

Я хочу обернуть мой алгоритм значения MAX в функцию. У меня есть несколько одинаковых алгоритмов, которые мне нужны, чтобы найти максимальную ширину каждой таблицы столбцов. Основная проблема в том, что у меня есть класс Mentor, который является моделью (MVC). Там у меня есть сеттеры и геттеры. Я не знаю, как обернуть код, который использует геттеры класса Mentor. Я выполняю итерацию по коллекции и использую методы получения, чтобы получить доступ к каждой переменной экземпляра.

Этот код ниже я хочу обернуть только в одну функцию.

List<Mentor> mentorList = managerDatabase.selectAllFromMentorsTable();

maxLengthID = mentorList.get(0).getId();
for(Mentor mentor: mentorList){
    int potentialMax = mentor.getId();
    if(potentialMax > maxLengthID){
        maxLengthID = potentialMax;
    }
}
//for example: code below this line is ALGORITHM MAX VALUE

maxLengthFirstName = mentorList.get(0).getFirstName().length();
for(Mentor mentor: mentorList){
    int potentialMax = mentor.getFirstName().length();
    if(potentialMax > maxLengthFirstName){
        maxLengthFirstName = potentialMax;
    }
}

//code above this line
maxLengthLastName = mentorList.get(0).getLastName().length();
for(Mentor mentor: mentorList){
    int potentialMax = mentor.getLastName().length();
    if(potentialMax > maxLengthLastName){
       maxLengthLastName = potentialMax;
    }

}

maxLengthNickName = mentorList.get(0).getNickName().length();
for(Mentor mentor: mentorList){
    int potentialMax = mentor.getNickName().length();
    if(potentialMax > maxLengthNickName){
       maxLengthNickName = potentialMax;
    }
}

maxLengthPhoneNumber = mentorList.get(0).getPhoneNumber().length();
for(Mentor mentor: mentorList){
   int potentialMax = mentor.getPhoneNumber().length();
   if(potentialMax > maxLengthPhoneNumber){
       maxLengthPhoneNumber = potentialMax;
   }
}

maxLengthEmail = mentorList.get(0).getEmail().length();
for(Mentor mentor: mentorList){
    int potentialMax = mentor.getEmail().length();
    if(potentialMax > maxLengthEmail){
        maxLengthEmail = potentialMax;
    }
}

maxLengthCity = mentorList.get(0).getCity().length();
for(Mentor mentor: mentorList){
    int potentialMax = mentor.getCity().length();
    if(potentialMax > maxLengthCity){
        maxLengthCity = potentialMax;
    }
}

maxLengthFavouriteNumber = mentorList.get(0).getFavouriteNumber().length();
for(Mentor mentor: mentorList){
    int potentialMax = mentor.getFavouriteNumber().length();
    if(potentialMax > maxLengthFavouriteNumber){
        maxLengthFavouriteNumber = potentialMax;
    }
}

А вот и моя модель класса Ментор

package codecool.Model;

public class Mentor {

    private int id;
    private String firstName;
    private String lastName;
    private String nickName;
    private String phoneNumber;
    private String email;
    private String city;
    private String favouriteNumber;

    public Mentor(){

    }

    public Mentor(int id, String firstName, String lastName, String nickName, String phoneNumber, String email, String city, String favouriteNumber){
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.nickName = nickName;
        this.phoneNumber = phoneNumber;
        this.email = email;
        this.city = city;
        this.favouriteNumber = favouriteNumber;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getNickName() {
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getFavouriteNumber() {
        return favouriteNumber;
    }

    public void setFavouriteNumber(String favouriteNumber) {
        this.favouriteNumber = favouriteNumber;
    }
}

Что-то вроде этого, я хочу включить в функцию:

maxLengthNickName = mentorList.get(0).getNickName().length();
for(Mentor mentor: mentorList){
    int potentialMax = mentor.getNickName().length();
    if(potentialMax > maxLengthNickName){
       maxLengthNickName = potentialMax;
    }
}

Как видите, код с максимальным значением алгоритма повторяется несколько раз.

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Я бы обобщил это с помощью метода, такого как:

public <T> int max(List<T> list, ToIntFunction<T> toInt) {
    int max = toInt.applyAsInt(list.get(0));
    for(T t : list) {
        if(toInt.applyAsInt(t) > max) {
            max = toInt.applyAsInt(t);
        }
    }
    return max;
}

И затем каждый раз, когда вам нужно позвонить (например, с помощью String), вы можете сделать:

List<String> list = Arrays.asList("Hello", "one", "four", "biggest");
ToIntFunction<String> length = (str) -> str.length();
int biggest = max(list, length);

Или передать его напрямую через ссылку на метод:

int biggest = max(list, String::length);

Который вернет 7

Или Java 8+ вы можете сделать:

public <T> int max(List<T> list, ToIntFunction<T> toInt) {
     return list.stream().mapToInt(toInt).max().orElse(Integer.MIN_VALUE);
}

Что избавит вас от необходимости писать один и тот же цикл снова и снова


Документация для ToIntFunction

0 голосов
/ 16 января 2019

Вы можете использовать потоки, которые сделают это за вас.

Например:

 maxLengthNickname = mentorList
                .stream()
                .mapToInt(mentor -> mentor.getNickname().getLength())
                .max();

Однако недостатком является то, что как в вашем примере, так и в этом случае вы будете повторять один и тот же цикл несколько раз.

Может быть, имеет смысл сделать один цикл и сделать их все внутри.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...