如何将算法最大值包装到函数中?

时间:2019-01-16 20:37:51

标签: java arraylist model

我想将我的MAX值算法包装到函数中。我有一些相同的算法,我需要找到每个列表的最大宽度。主要的问题是我有Mentor类,它是模型(MVC)。那里我有二传手和吸气剂。我不知道如何包装使用Mentor类的getter的代码。我通过集合进行迭代,并使用getter来访问每个实例变量。

下面的这段代码我只想包装成一个函数。

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 :(得分:0)

您可以使用流,这将为您完成。

例如:

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

但是,缺点是在您的示例中,在这种情况下,您将多次循环同一循环。

做一个循环然后全部在里面做可能更有意义。

答案 1 :(得分:0)

我可以用以下方法将其概括化:

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的文档