【问题标题】:compare varying object values from arraylist比较来自arraylist的不同对象值
【发布时间】:2013-01-03 11:04:17
【问题描述】:

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

    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 个相似的功能似乎不正确,所以我尝试将它组合所有功能并添加一个开关/案例

    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 个函数,但它也不让我高兴。你有什么改进的想法吗?

谢谢。

【问题讨论】:

    标签: java object loops compare


    【解决方案1】:

    像这样实现您的所有不同需求:

    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()。您还可以实现复杂的比较器,将多个属性值考虑在内。

    【讨论】:

      【解决方案2】:

      实现一个比较器

       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)) 获取最大值

      【讨论】:

      • 现在您将所有丑陋的代码都带入compare(),因为必须考虑设置。编写、维护和调试不同的Comparator 类来满足不同的需求要容易得多,而不是将所有逻辑打包到一个中。
      • 恕我直言,这取决于他是否已经有一个设置对象。如果该 Setting 对象是为此目的而创建的,那么您提到的拥有多个比较器会更好。
      • 即使他已经有一个Settings 对象,我的方法更好,因为它会生成简短的可维护方法。他可以根据Setting 选择比较器,而不是拥有一个包含(伪代码)if (Setting == Option1)... else if (Setting == Option2)... 之类代码的巨型比较器
      • 同意我的方式生成一个更大更复杂的 compare() 方法。另一方面,在您的方法中,我们必须编写很多类,每个类都有更小的方法。好吧,我没有经验去理解哪个更好。
      • 更好总是主观的。但是如果我在调试时寻找错误,我宁愿阅读 10 个方法,每个方法 30 行(最好易于阅读),而不是一个 300 行(这很可能非常复杂,或者不会那么长) .另外,如果你以后想添加一些逻辑,你可以只添加一个新的比较器,而不是在巨大的比较器中找到合适的位置添加代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2023-03-10
      • 1970-01-01
      • 2015-09-10
      • 2011-12-21
      • 1970-01-01
      • 2022-10-16
      相关资源
      最近更新 更多