我想将我的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;
}
}
您会看到具有算法最大值的代码重复了几次。
答案 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);
}
这将使您不必一遍又一遍地编写相同的循环