2013-01-03 24 views
0

根据用户的喜好,我想比较一个数组列表的对象值并获取最大值。我的第一种方法是为对象属性定义一个函数并遍历数组列表。比较来自arraylist的不同对象值

private MyModel getMaxValueA(ArrayList<MyModel> myModelList) { 
    MyModel res = null; 
    for (MyModel myModel : myModelList) { 
     if (myModel != null) { 
      if (myModel.valueA() > res.valueA()) { 
       res = myModel; 
      } 
     } else { 
      res = myModel; 
     } 
    } 
    return res; 
} 

的问题是,我有4个不同的值,我想比较,并确定4类似的Funktion似乎并没有被正确的是,所以我尝试了所有的功能组合,并添加了开关/箱

private MyModel getMaxValueA(ArrayList<MyModel> myModelList, Setting mySetting) { 
    MyModel res = null; 
    for (MyModel myModel : myModelList) { 
     if (myModel != null) { 
      switch (mySetting) { 
      case settingA: 
       if (myModel.valueA() > res.valueA()) { 
        res = myModel; 
        } 
       break; 
      case settingB: 
       if (myModel.valueB() > res.valueB()) { 
        res = myModel; 
        } 

       break; 
      ........ 
     } else { 
      res = myModel; 
     } 
    } 
    return res; 
} 

这有点短,只有1个而不是4个功能,但它也不让我高兴。你有什么想法来改进它吗?

谢谢。

回答

0

实现一个比较

class MyComparator extends Comparator<MyModel> { 
    Setting s; 
    MyComparator(Setting s){ 
     this.setting=s; 
    } 
    public int compare(MyModel model, MyModel model2) { 
     //do the comparison utilizing setting 

    } 

编辑在看另一个答案:然后使用Collections.max(listToBeSorted, new MyComparator(setting)),以获得最大的价值

+0

现在您将所有难看的代码都放入'compare()'中,因为必须考虑该设置。编写,维护和调试更容易,针对不同需求使用不同的Comparator类,而不是将所有逻辑合并为一个。 – jlordo

+0

恕我直言,这取决于他是否已经有一个设置对象。如果该设置对象是为此目的而创建的,那么您提到的具有多个比较器的效果会更好。 – Subin

+0

即使他已经有一个'Settings'对象,我的方式更好,因为它会生成短暂的可维护方法。他可以根据'Setting'来选择比较器,而不是像一个巨大的比较器,它包含像(伪代码)if(设置==选项1)... else else(设置==选项2)的代码......' – jlordo

2

实现您的不同需求是这样的:

class SettingsAComparator extends Comparator<MyModel> { 
    @Override 
    public int compare(MyModel m1, MyModel m2) { 
     return m1.valueA() - m2.valueA(); 
    } 
} 

class SettingsBComparator extends Comparator<MyModel> { 
    // Please use better names. 
    // you can implement as many Comparators as necessary. 
} 

,改变你的方法到

private MyModel getMaxValue(ArrayList<MyModel> myModelList, Comparator<MyModel> comparator) { 
    return Collections.max(myModelList, comparator); 
} 

这样,如果您的课程获得新的属性,您可以随时添加不同的比较器,但是您再也不必担心要更改getMaxValue()。您也可以实现复杂的比较器,这些比较器需要考虑多个属性值。