【问题标题】:Merge multiple for loop in JAVA Generic method在JAVA通用方法中合并多个for循环
【发布时间】:2018-03-26 08:34:10
【问题描述】:

我目前正在修改一个高级项目,但我仍然是 JAVA 的新手。我试图搜索有关泛型方法和应用的大量信息,但它们似乎不正确。请帮助我,看看并纠正我哪里错了。谢谢你。 =)

下面是我尝试用于合并 for 循环的通用方法的代码。

public String[] name = {
 "SDLManPower sdlManPower",
 "SDLScopeOfWork sdlSOW",
 "SDLMaterial sdlMat",
 "SDLUtility sdlUtil",
 "SDLTMEquip sdlTMEquip"
};

public String[] sname = {
 "sdlManPower",
 "sdlSOW",
 "sdlMat",
 "sdlUtil",
 "sdlTMEquip"
};

public String[] list = {
 "getAttendanceList()",
 "getSowList()",
 "SDLMaterial sdlMat",
 "getUtilityList()",
 "getEquipmentList()"
};

public String[] forlp = {
 "(SDLManPower manPower : sdlManPowerList",
 "SDLScopeOfWork sow : sdlSOWList",
 "SDLMaterial projectMat : sdlMaterialList",
 "SDLUtility utility : sdlUtilityList",
 "SDLTMEquip sdlEquipment : sdlEquipmentList"
};

public String[] id = {
 "getUserUID()",
 "getSubTreatmentID()",
 "getPurposeID()",
 "getUtilityID()",
 "getSubEquipmentID()"
};

public String[] fname = {
 "manPower",
 "sow",
 "projectMat",
 "utility",
 "sdlEquipment"
};


public static < T > void AllList(T[] name, T[] sname, T[] list, T[] forlp, T[] id, T[] fname) {

 for (T x: name) {
  for (name[x]: sdlReportObj.list[x]) {
   Boolean alreadyExist = true;
   for (forlp[x]) {
    if (sname[x].id[x] == fname[x].id[x] && sname[x].getProjectTeamUID().equals(fname[x].getProjectTeamUID())) {
     alreadyExist = true;
     break;
    } else {
     alreadyExist = false;
    }
   }
   if (!alreadyExist) {

    UserGroup user = null;
    Vendor v = null;
    ProjectArrangement[] arrangementList = projectInfo.getProjPlan().getArrangementList();
    for (ProjectArrangement projArrangement: arrangementList) {
     if (projArrangement.getuID().equals(sname[x].getProjectTeamUID())) {

      if (projArrangement.getUserGroupUID() != null) {
       user = userList.getUserGroupCollection().findUserGroup(projArrangement.getUserGroupUID());
      } else {
       v = (Vendor) maintData.getVendorCollection().findItem(projArrangement.getVendorID());
      }
     }
    }

    sname[x].setTeamName(user != null ? user.getRoleFullName() : v.getName());
    sname[x].setUserGroupID(user != null ? user.getRoleUID() : v.getId() + "");
    sname[x].setDeletable(true);
    sname[x].setValue(0.00);
    sname[x].setPreLoad(false);
    sdlEquipmentList.add(sdlTMEquip);
   }
  }
 } //for name
}

下面的代码是资深的工作。他使用了许多 for 循环来执行类似的操作。 因此,我想使用一种通用方法,通过将所有 for 循环合并为一个来减少系统加载时间。但我失败了。 =(

if (sdlReportObj != null && sdlReportObj.getProjectUID().equals(projectInfo.getProjectUID())) {
 for (SDLExpenses sdlExpenses: sdlReportObj.getExpensesList()) {
  Boolean alreadyExist = true;
  for (ProjectExpenses projExpenses: projectInfo.getProjPlan().getExpensesList()) {
   if (projExpenses.getExpensesItemID() == sdlExpenses.getSubExpensesItemID()) {
    alreadyExist = true;
    break;
   } else {
    alreadyExist = false;
   }
  }
  if (!alreadyExist || projectInfo.getProjPlan().getExpensesList().length == 0) {

   sdlExpenses.setDeletable(true);
   sdlExpenses.setValue(0.00);
   sdlExpenses.setPreLoad(false);
   sdlExpensesList.add(sdlExpenses);
  }
 }

 for (SDLManPower sdlManPower: sdlReportObj.getAttendanceList()) {
  Boolean alreadyExist = true;
  for (SDLManPower manPower: sdlManPowerList) {
   if (manPower.getUserUID().equals(sdlManPower.getUserUID()) && sdlManPower.getProjectTeamUID().equals(manPower.getProjectTeamUID())) {
    alreadyExist = true;
    break;
   } else {
    alreadyExist = false;
   }
  }
  if (!alreadyExist) {
   // tempManPower.setDeletable(false);
   UserGroup user = null;
   Vendor v = null;
   ProjectArrangement[] arrangementList = projectInfo.getProjPlan().getArrangementList();
   for (ProjectArrangement projArrangement: arrangementList) {
    if (projArrangement.getuID().equals(sdlManPower.getProjectTeamUID())) {

     if (projArrangement.getUserGroupUID() != null) {
      user = userList.getUserGroupCollection().findUserGroup(projArrangement.getUserGroupUID());
     } else {
      v = (Vendor) maintData.getVendorCollection().findItem(projArrangement.getVendorID());
     }
    }
   }

   sdlManPower.setTeamName(user != null ? user.getRoleFullName() : v.getName());
   sdlManPower.setUserGroupID(user != null ? user.getRoleUID() : v.getId() + "");
   sdlManPower.setStartTime(null);
   sdlManPower.setEndTime(null);
   sdlManPower.setPreLoad(false);
   sdlManPowerList.add(sdlManPower);
  }
 }


 ArrayList < SDLScopeOfWork > tempSOWList = new ArrayList < SDLScopeOfWork > ();
 for (SDLScopeOfWork sdlSOW: sdlReportObj.getSowList()) { //foreach sow in sdl
  Boolean alreadyExist = true;

  for (SDLScopeOfWork sow: sdlSOWList) {
   if (sdlSOW.getSubTreatmentID() == sow.getSubTreatmentID() && sdlSOW.getProjectTeamUID().equals(sow.getProjectTeamUID())) { //
    alreadyExist = true;
    break;
   } else {
    alreadyExist = false;
    tempSOWList.add(sow);
   }
  }

  if (!alreadyExist) {
   UserGroup user = null;
   Vendor v = null;
   ProjectArrangement[] arrangementList = projectInfo.getProjPlan().getArrangementList();
   for (ProjectArrangement projArrangement: arrangementList) {
    if (projArrangement.getuID().equals(sdlSOW.getProjectTeamUID())) {

     if (projArrangement.getUserGroupUID() != null) {
      user = userList.getUserGroupCollection().findUserGroup(projArrangement.getUserGroupUID());
     } else {
      v = (Vendor) maintData.getVendorCollection().findItem(projArrangement.getVendorID());
     }
    }
   }

   sdlSOW.setTeamName(user != null ? user.getRoleFullName() : v.getName());
   sdlSOW.setUserGroupID(user != null ? user.getRoleUID() : v.getId() + "");
   sdlSOW.setDeletable(true);
   sdlSOW.setFrom(0.00);
   sdlSOW.setTo(0.00);
   sdlSOW.setValue(0.00);
   sdlSOW.setPreLoad(false);

   sdlSOWList.add(sdlSOW);
  }
 }
 //sdlSOWList.addAll(tempSOWList);

 for (SDLMaterial sdlMat: sdlReportObj.SDLMaterial sdlMat) {
  Boolean alreadyExist = true;
  for (SDLMaterial projectMat: sdlMaterialList) {
   if (sdlMat.getPurposeID() == projectMat.getPurposeID() && sdlMat.getProjectTeamUID().equals(projectMat.getProjectTeamUID())) {
    alreadyExist = true;
    break;
   } else {
    alreadyExist = false;
   }
  }
  if (!alreadyExist) {
   UserGroup user = null;
   Vendor v = null;
   ProjectArrangement[] arrangementList = projectInfo.getProjPlan().getArrangementList();
   for (ProjectArrangement projArrangement: arrangementList) {
    if (projArrangement.getuID().equals(sdlMat.getProjectTeamUID())) {

     if (projArrangement.getUserGroupUID() != null) {
      user = userList.getUserGroupCollection().findUserGroup(projArrangement.getUserGroupUID());
     } else {
      v = (Vendor) maintData.getVendorCollection().findItem(projArrangement.getVendorID());
     }
    }
   }

   sdlMat.setTeamName(user != null ? user.getRoleFullName() : v.getName());
   sdlMat.setUserGroupID(user != null ? user.getRoleUID() : v.getId() + "");
   sdlMat.setDeletable(true);
   sdlMat.setValue(0.00);
   sdlMat.setPreLoad(false);

   sdlMaterialList.add(sdlMat);
  }
 }

 for (SDLUtility sdlUtil: sdlReportObj.getUtilityList()) { // a,b,d,c
  Boolean alreadyExist = true;

  for (SDLUtility utility: sdlUtilityList) { // a,b,c
   if (sdlUtil.getUtilityID() == utility.getUtilityID() && sdlUtil.getProjectTeamUID().equals(utility.getProjectTeamUID())) {
    alreadyExist = true;
    break;
   } else {
    alreadyExist = false;
   }
  }

  if (!alreadyExist) {
   UserGroup user = null;
   Vendor v = null;
   ProjectArrangement[] arrangementList = projectInfo.getProjPlan().getArrangementList();
   for (ProjectArrangement projArrangement: arrangementList) {
    if (projArrangement.getuID().equals(sdlUtil.getProjectTeamUID())) {

     if (projArrangement.getUserGroupUID() != null) {
      user = userList.getUserGroupCollection().findUserGroup(projArrangement.getUserGroupUID());
     } else {
      v = (Vendor) maintData.getVendorCollection().findItem(projArrangement.getVendorID());
     }
    }
   }

   sdlUtil.setTeamName(user != null ? user.getRoleFullName() : v.getName());
   sdlUtil.setUserGroupID(user != null ? user.getRoleUID() : v.getId() + "");
   sdlUtil.setDeletable(true);
   sdlUtil.setRegistrationNo(null);
   sdlUtil.setValue(0.00);
   sdlUtil.setPreLoad(false);
   sdlUtilityList.add(sdlUtil);
  }
 }

 // tm equip
 for (SDLTMEquip sdlTMEquip: sdlReportObj.getEquipmentList()) {
  Boolean alreadyExist = true;
  for (SDLTMEquip sdlEquipment: sdlEquipmentList) {
   if (sdlTMEquip.getSubEquipmentID() == sdlEquipment.getSubEquipmentID() && sdlTMEquip.getProjectTeamUID().equals(sdlEquipment.getProjectTeamUID())) {
    alreadyExist = true;
    break;
   } else {
    alreadyExist = false;
   }
  }
  if (!alreadyExist) {

   UserGroup user = null;
   Vendor v = null;
   ProjectArrangement[] arrangementList = projectInfo.getProjPlan().getArrangementList();
   for (ProjectArrangement projArrangement: arrangementList) {
    if (projArrangement.getuID().equals(sdlTMEquip.getProjectTeamUID())) {

     if (projArrangement.getUserGroupUID() != null) {
      user = userList.getUserGroupCollection().findUserGroup(projArrangement.getUserGroupUID());
     } else {
      v = (Vendor) maintData.getVendorCollection().findItem(projArrangement.getVendorID());
     }
    }
   }

   sdlTMEquip.setTeamName(user != null ? user.getRoleFullName() : v.getName());
   sdlTMEquip.setUserGroupID(user != null ? user.getRoleUID() : v.getId() + "");
   sdlTMEquip.setDeletable(true);
   sdlTMEquip.setValue(0.00);
   sdlTMEquip.setPreLoad(false);
   sdlEquipmentList.add(sdlTMEquip);
  }
 }

是否可以使用通用方法来减少加载时间和循环次数? 还有其他方法可以解决吗?谢谢。

【问题讨论】:

    标签: java generics generic-programming generic-list


    【解决方案1】:

    好的,首先,看起来您的学长只是在 ide 中呕吐,并通过复制/粘贴前几行来做同样的事情。所以请不要抄袭他的作品,因为他自称是前辈。我是从糟糕的经历中说出来的。

    所以是的,你可以重构一些像泛型这样的想法。但这不是您问题的答案。答案是:只需将问题分解为更小、更方便的问题。

    SDLExpenses、SDLScopeOfWork、SDLMaterial、SDLUtility 和 SDLTMEquip 应该有一个通用接口,将其命名为 SDLIntf,您应该使用该接口实现 5 个新类。 使用抽象工厂 (https://dzone.com/articles/design-patterns-abstract-factory) 获取类的新实例,根据类型,您返回产品。 IE。 sdlReportObj.SDLMaterial 你返回一个新的 SDLMaterial 对象。

    每个类都有在 SDLIntf 中定义的相同方法,我们称之为 SortData(),这是你应该做的工作。如果你使用 for 循环,好的。但是,如果您使用 Java 8,请尝试使用 Lambda 表达式。这样,每个 for 循环和 if 都可以替换为一行代码。但是,如果您使用 Java 5 到 7,请坚持您的前辈正在使用的 foreach 循环,这没有错。

    解释完整的重构类工作量太大,但我的代码如下所示:

    if (sdlReportObj != null && sdlReportObj.getProjectUID().equals(projectInfo.getProjectUID())) {
        SDLIntf mat = SDLFactory.GetProduct(sdlMat, projectInfo);
        SDLIntf sdlSOW = SDLFactory.GetProduct(sdlReportObj.getSowList(), projectInfo);
    
        mat.SortData();
        sdlSOW.SortData();
        ... etc......
    }
    

    因此,最后您应该访问数据并对其进行处理。但只有你知道它应该做什么。最好的事情是,你可以很容易地对整个单元进行单元测试。

    是的,你可以在你的类中运行私有方法来解决更小的问题,比如在 SDLScopeOfWork 中,我认为至少有 4 个小方法具有更易读的代码的潜力。老实说,我什至很难理解他为什么要使用多个 for 循环。

    我在 Notepad++ 中做了一个快速的思考(这台机器上没有 Java IDE;))-> https://pastebin.com/qkFHAb4J

    也许这会给你正确的方向。

    【讨论】:

    • 非常感谢。现在我有一个正确的方向来完成它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 2023-01-06
    • 1970-01-01
    相关资源
    最近更新 更多